Reviewed-on: #45 Co-authored-by: Boming Zhang <bomingzh@sjtu.edu.cn> Co-committed-by: Boming Zhang <bomingzh@sjtu.edu.cn>
This commit is contained in:
		
							parent
							
								
									28bf70d0a9
								
							
						
					
					
						commit
						049a5e6e7e
					
				|  | @ -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