feat: debug log to file & info log to stderr
All checks were successful
build / build (push) Successful in 1m11s
build / trigger-build-image (push) Has been skipped
build / build (pull_request) Successful in 1m9s
build / trigger-build-image (pull_request) Has been skipped

This commit is contained in:
张泊明518370910136 2024-10-01 15:52:17 -04:00
parent 28bf70d0a9
commit cdf3217c82
GPG Key ID: D47306D7062CDA9D
3 changed files with 81 additions and 12 deletions

View File

@ -15,7 +15,7 @@ import (
type Conf struct { type Conf struct {
SandboxExecServer string `default:"localhost:5051"` SandboxExecServer string `default:"localhost:5051"`
SandboxToken string `default:""` SandboxToken string `default:""`
LogLevel int `default:"0"` LogPath string `default:""`
OutputPath string `default:"joj3_result.json"` OutputPath string `default:"joj3_result.json"`
Stages []struct { Stages []struct {
Name string Name string

74
cmd/joj3/log.go Normal file
View File

@ -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
}

View File

@ -15,15 +15,6 @@ import (
"github.com/jinzhu/copier" "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) { func getCommitMsg() (msg string, err error) {
r, err := git.PlainOpen(".") r, err := git.PlainOpen(".")
if err != nil { if err != nil {
@ -104,7 +95,9 @@ func init() {
} }
func mainImpl() error { func mainImpl() error {
setupSlog(int(slog.LevelInfo)) // before conf is loaded if err := setupSlog(""); err != nil { // before conf is loaded
return err
}
flag.Parse() flag.Parse()
if *showVersion { if *showVersion {
fmt.Println(Version) fmt.Println(Version)
@ -123,7 +116,9 @@ func mainImpl() error {
slog.Error("no conf found", "error", err) slog.Error("no conf found", "error", err)
return 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) executors.InitWithConf(conf.SandboxExecServer, conf.SandboxToken)
stages, err := generateStages(conf) stages, err := generateStages(conf)
if err != nil { if err != nil {