From e4e74456453f5ce22230af49e1f66727ffa7ad66 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Mon, 18 Nov 2024 00:18:01 -0500 Subject: [PATCH] feat(cmd/joj3): support actor csv --- cmd/joj3/conf/conf.go | 1 + cmd/joj3/env/env.go | 2 ++ cmd/joj3/log.go | 52 +++++++++++++++++++++++++++++++++++++++---- cmd/joj3/main.go | 4 ++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/cmd/joj3/conf/conf.go b/cmd/joj3/conf/conf.go index c561d5c..e325830 100644 --- a/cmd/joj3/conf/conf.go +++ b/cmd/joj3/conf/conf.go @@ -38,6 +38,7 @@ type ConfStage struct { type Conf struct { Name string `default:"unknown"` LogPath string `default:""` + ActorCsvPath string `default:""` ExpireUnixTimestamp int64 `default:"-1"` MaxTotalScore int `default:"-1"` Stage struct { diff --git a/cmd/joj3/env/env.go b/cmd/joj3/env/env.go index f0bc015..2b88321 100644 --- a/cmd/joj3/env/env.go +++ b/cmd/joj3/env/env.go @@ -15,6 +15,8 @@ type Attribute struct { Ref string Workflow string RunNumber string + ActorName string + ActorID string } var Attr Attribute diff --git a/cmd/joj3/log.go b/cmd/joj3/log.go index 08552b2..93ee605 100644 --- a/cmd/joj3/log.go +++ b/cmd/joj3/log.go @@ -2,9 +2,12 @@ package main import ( "context" + "encoding/csv" + "io" "log/slog" "os" + "github.com/joint-online-judge/JOJ3/cmd/joj3/conf" "github.com/joint-online-judge/JOJ3/cmd/joj3/env" ) @@ -50,17 +53,56 @@ func (h *multiHandler) WithGroup(name string) slog.Handler { return &multiHandler{handlers: handlers} } -func getSlogAttrs() []slog.Attr { - return []slog.Attr{ +func getSlogAttrs(csvPath string) (attrs []slog.Attr) { + attrs = []slog.Attr{ slog.String("runID", env.Attr.RunID), slog.String("confName", env.Attr.ConfName), slog.String("actor", env.Attr.Actor), + slog.String("actorName", env.Attr.ActorName), + slog.String("actorID", env.Attr.ActorID), slog.String("repository", env.Attr.Repository), slog.String("sha", env.Attr.Sha), } + file, err := os.Open(csvPath) + if err != nil { + slog.Error("open csv", "error", err) + return + } + defer file.Close() + reader := csv.NewReader(file) + for { + row, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + slog.Error("read csv", "error", err) + return + } + if len(row) < 3 { + continue + } + actor := row[2] + slog.Info("actor", "actor", actor) + if actor == env.Attr.Actor { + env.Attr.ActorName = row[0] + env.Attr.ActorID = row[1] + return []slog.Attr{ + slog.String("runID", env.Attr.RunID), + slog.String("confName", env.Attr.ConfName), + slog.String("actor", env.Attr.Actor), + slog.String("actorName", env.Attr.ActorName), + slog.String("actorID", env.Attr.ActorID), + slog.String("repository", env.Attr.Repository), + slog.String("sha", env.Attr.Sha), + } + } + } + return } -func setupSlog(logPath string) error { +func setupSlog(conf *conf.Conf) error { + logPath := conf.LogPath handlers := []slog.Handler{} if logPath != "" { // Text file handler for debug logs @@ -99,7 +141,9 @@ func setupSlog(logPath string) error { } // Create a multi-handler multiHandler := &multiHandler{handlers: handlers} - multiHandlerWithAttrs := multiHandler.WithAttrs(getSlogAttrs()) + multiHandlerWithAttrs := multiHandler.WithAttrs( + getSlogAttrs(conf.ActorCsvPath), + ) // Set the default logger logger := slog.New(multiHandlerWithAttrs) slog.SetDefault(logger) diff --git a/cmd/joj3/main.go b/cmd/joj3/main.go index ced4517..47fc83c 100644 --- a/cmd/joj3/main.go +++ b/cmd/joj3/main.go @@ -60,7 +60,7 @@ func mainImpl() (err error) { "error", err, ) }() - if err := setupSlog(""); err != nil { // before conf is loaded + if err := setupSlog(confObj); err != nil { // before conf is loaded slog.Error("setup slog", "error", err) return err } @@ -91,7 +91,7 @@ func mainImpl() (err error) { return err } slog.Debug("conf loaded", "conf", confObj) - if err := setupSlog(confObj.LogPath); err != nil { // after conf is loaded + if err := setupSlog(confObj); err != nil { // after conf is loaded slog.Error("setup slog", "error", err) return err }