feat: debug log to file & info log to stderr
This commit is contained in:
parent
28bf70d0a9
commit
cdf3217c82
|
@ -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
74
cmd/joj3/log.go
Normal 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
|
||||||
|
}
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user