From cdf3217c8251e476bb0b7a237254ac79d060111c Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Tue, 1 Oct 2024 15:52:17 -0400 Subject: [PATCH] feat: debug log to file & info log to stderr --- cmd/joj3/conf.go | 2 +- cmd/joj3/log.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ cmd/joj3/main.go | 17 ++++------- 3 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 cmd/joj3/log.go diff --git a/cmd/joj3/conf.go b/cmd/joj3/conf.go index 3b006c9..95c9d83 100644 --- a/cmd/joj3/conf.go +++ b/cmd/joj3/conf.go @@ -15,7 +15,7 @@ import ( type Conf struct { SandboxExecServer string `default:"localhost:5051"` SandboxToken string `default:""` - LogLevel int `default:"0"` + LogPath string `default:""` OutputPath string `default:"joj3_result.json"` Stages []struct { Name string diff --git a/cmd/joj3/log.go b/cmd/joj3/log.go new file mode 100644 index 0000000..821d0c2 --- /dev/null +++ b/cmd/joj3/log.go @@ -0,0 +1,74 @@ +package main + +import ( + "context" + "log/slog" + "os" +) + +type multiHandler struct { + handlers []slog.Handler +} + +func (h *multiHandler) Enabled(ctx context.Context, level slog.Level) bool { + for _, handler := range h.handlers { + if handler.Enabled(ctx, level) { + return true + } + } + return false +} + +func (h *multiHandler) Handle(ctx context.Context, r slog.Record) error { + for _, handler := range h.handlers { + if handler.Enabled(ctx, r.Level) { + if err := handler.Handle(ctx, r); err != nil { + return err + } + } + } + return nil +} + +func (h *multiHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + handlers := make([]slog.Handler, len(h.handlers)) + for i, handler := range h.handlers { + handlers[i] = handler.WithAttrs(attrs) + } + return &multiHandler{handlers: handlers} +} + +func (h *multiHandler) WithGroup(name string) slog.Handler { + handlers := make([]slog.Handler, len(h.handlers)) + for i, handler := range h.handlers { + handlers[i] = handler.WithGroup(name) + } + return &multiHandler{handlers: handlers} +} + +func setupSlog(logPath string) error { + handlers := []slog.Handler{} + if logPath != "" { + // File handler for debug logs + debugFile, err := os.OpenFile(logPath, + os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600) + if err != nil { + return err + } + debugHandler := slog.NewTextHandler(debugFile, &slog.HandlerOptions{ + Level: slog.LevelDebug, + }) + handlers = append(handlers, debugHandler) + } + // Stderr handler for info logs and above + stderrHandler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + Level: slog.LevelInfo, + }) + handlers = append(handlers, stderrHandler) + // Create a multi-handler + multiHandler := &multiHandler{handlers: handlers} + // Set the default logger + logger := slog.New(multiHandler) + slog.SetDefault(logger) + return nil +} diff --git a/cmd/joj3/main.go b/cmd/joj3/main.go index 8f45bb5..9b42ffa 100644 --- a/cmd/joj3/main.go +++ b/cmd/joj3/main.go @@ -15,15 +15,6 @@ import ( "github.com/jinzhu/copier" ) -func setupSlog(logLevel int) { - lvl := new(slog.LevelVar) - lvl.Set(slog.Level(logLevel)) - opts := &slog.HandlerOptions{Level: lvl} - handler := slog.NewTextHandler(os.Stderr, opts) - logger := slog.New(handler) - slog.SetDefault(logger) -} - func getCommitMsg() (msg string, err error) { r, err := git.PlainOpen(".") if err != nil { @@ -104,7 +95,9 @@ func init() { } func mainImpl() error { - setupSlog(int(slog.LevelInfo)) // before conf is loaded + if err := setupSlog(""); err != nil { // before conf is loaded + return err + } flag.Parse() if *showVersion { fmt.Println(Version) @@ -123,7 +116,9 @@ func mainImpl() error { slog.Error("no conf found", "error", err) return err } - setupSlog(conf.LogLevel) // after conf is loaded + if err := setupSlog(conf.LogPath); err != nil { // after conf is loaded + return err + } executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken) stages, err := generateStages(conf) if err != nil { -- 2.30.2