diff options
| author | Kujtim Hoxha <[email protected]> | 2025-04-10 13:29:44 +0200 |
|---|---|---|
| committer | Kujtim Hoxha <[email protected]> | 2025-04-10 13:29:44 +0200 |
| commit | 36f201d5d3aaba7e0285d86cf1c0cf6b54769cff (patch) | |
| tree | 1f1c99e66df4c25f816fbfba2b1e255c94bec9ba /internal/logging | |
| parent | 0b007b9c77bc790127021a7e03c8e05ec8e5e081 (diff) | |
| download | opencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.tar.gz opencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.zip | |
fix logs and add cancellation
Diffstat (limited to 'internal/logging')
| -rw-r--r-- | internal/logging/default.go | 12 | ||||
| -rw-r--r-- | internal/logging/logger.go | 136 | ||||
| -rw-r--r-- | internal/logging/logging.go | 23 | ||||
| -rw-r--r-- | internal/logging/writer.go | 49 |
4 files changed, 62 insertions, 158 deletions
diff --git a/internal/logging/default.go b/internal/logging/default.go deleted file mode 100644 index 54cfaa490..000000000 --- a/internal/logging/default.go +++ /dev/null @@ -1,12 +0,0 @@ -package logging - -var defaultLogger Interface - -func Get() Interface { - if defaultLogger == nil { - defaultLogger = NewLogger(Options{ - Level: "info", - }) - } - return defaultLogger -} diff --git a/internal/logging/logger.go b/internal/logging/logger.go index 1f0e61d00..b06391472 100644 --- a/internal/logging/logger.go +++ b/internal/logging/logger.go @@ -1,141 +1,39 @@ package logging -import ( - "context" - "io" - "log/slog" - "slices" +import "log/slog" - "github.com/kujtimiihoxha/termai/internal/pubsub" - "golang.org/x/exp/maps" -) - -const DefaultLevel = "info" - -const ( - persistKeyArg = "$persist" - PersistTimeArg = "$persist_time" -) - -var levels = map[string]slog.Level{ - "debug": slog.LevelDebug, - DefaultLevel: slog.LevelInfo, - "warn": slog.LevelWarn, - "error": slog.LevelError, -} - -func ValidLevels() []string { - keys := maps.Keys(levels) - slices.SortFunc(keys, func(a, b string) int { - if a == DefaultLevel { - return -1 - } - if b == DefaultLevel { - return 1 - } - if a < b { - return -1 - } - return 1 - }) - return keys -} - -func NewLogger(opts Options) Interface { - logger := &Logger{} - broker := pubsub.NewBroker[LogMessage]() - writer := &writer{ - messages: []LogMessage{}, - Broker: broker, - } - - handler := slog.NewTextHandler( - io.MultiWriter(writer), - &slog.HandlerOptions{ - Level: slog.Level(levels[opts.Level]), - }, - ) - logger.logger = slog.New(handler) - logger.writer = writer - - return logger +func Info(msg string, args ...any) { + slog.Info(msg, args...) } -type Options struct { - Level string +func Debug(msg string, args ...any) { + slog.Debug(msg, args...) } -type Logger struct { - logger *slog.Logger - writer *writer +func Warn(msg string, args ...any) { + slog.Warn(msg, args...) } -func (l *Logger) SetLevel(level string) { - if _, ok := levels[level]; !ok { - level = DefaultLevel - } - handler := slog.NewTextHandler( - io.MultiWriter(l.writer), - &slog.HandlerOptions{ - Level: levels[level], - }, - ) - l.logger = slog.New(handler) +func Error(msg string, args ...any) { + slog.Error(msg, args...) } -// PersistDebug implements Interface. -func (l *Logger) PersistDebug(msg string, args ...any) { +func InfoPersist(msg string, args ...any) { args = append(args, persistKeyArg, true) - l.Debug(msg, args...) + slog.Info(msg, args...) } -// PersistError implements Interface. -func (l *Logger) PersistError(msg string, args ...any) { +func DebugPersist(msg string, args ...any) { args = append(args, persistKeyArg, true) - l.Error(msg, args...) + slog.Debug(msg, args...) } -// PersistInfo implements Interface. -func (l *Logger) PersistInfo(msg string, args ...any) { +func WarnPersist(msg string, args ...any) { args = append(args, persistKeyArg, true) - l.Info(msg, args...) + slog.Warn(msg, args...) } -// PersistWarn implements Interface. -func (l *Logger) PersistWarn(msg string, args ...any) { +func ErrorPersist(msg string, args ...any) { args = append(args, persistKeyArg, true) - l.Warn(msg, args...) -} - -func (l *Logger) Debug(msg string, args ...any) { - l.logger.Debug(msg, args...) -} - -func (l *Logger) Info(msg string, args ...any) { - l.logger.Info(msg, args...) -} - -func (l *Logger) Warn(msg string, args ...any) { - l.logger.Warn(msg, args...) -} - -func (l *Logger) Error(msg string, args ...any) { - l.logger.Error(msg, args...) -} - -func (l *Logger) List() []LogMessage { - return l.writer.messages -} - -func (l *Logger) Get(id string) (LogMessage, error) { - for _, msg := range l.writer.messages { - if msg.ID == id { - return msg, nil - } - } - return LogMessage{}, io.EOF -} - -func (l *Logger) Subscribe(ctx context.Context) <-chan pubsub.Event[LogMessage] { - return l.writer.Subscribe(ctx) + slog.Error(msg, args...) } diff --git a/internal/logging/logging.go b/internal/logging/logging.go deleted file mode 100644 index c23cfaff8..000000000 --- a/internal/logging/logging.go +++ /dev/null @@ -1,23 +0,0 @@ -package logging - -import ( - "context" - - "github.com/kujtimiihoxha/termai/internal/pubsub" -) - -type Interface interface { - Debug(msg string, args ...any) - Info(msg string, args ...any) - Warn(msg string, args ...any) - Error(msg string, args ...any) - Subscribe(ctx context.Context) <-chan pubsub.Event[LogMessage] - - PersistDebug(msg string, args ...any) - PersistInfo(msg string, args ...any) - PersistWarn(msg string, args ...any) - PersistError(msg string, args ...any) - List() []LogMessage - - SetLevel(level string) -} diff --git a/internal/logging/writer.go b/internal/logging/writer.go index 06a5330e3..9fe469c5e 100644 --- a/internal/logging/writer.go +++ b/internal/logging/writer.go @@ -2,18 +2,47 @@ package logging import ( "bytes" + "context" "fmt" + "strings" + "sync" "time" "github.com/go-logfmt/logfmt" "github.com/kujtimiihoxha/termai/internal/pubsub" ) -type writer struct { +const ( + persistKeyArg = "$_persist" + PersistTimeArg = "$_persist_time" +) + +type LogData struct { messages []LogMessage *pubsub.Broker[LogMessage] + lock sync.Mutex +} + +func (l *LogData) Add(msg LogMessage) { + l.lock.Lock() + defer l.lock.Unlock() + l.messages = append(l.messages, msg) + l.Publish(pubsub.CreatedEvent, msg) +} + +func (l *LogData) List() []LogMessage { + l.lock.Lock() + defer l.lock.Unlock() + return l.messages +} + +var defaultLogData = &LogData{ + messages: make([]LogMessage, 0), + Broker: pubsub.NewBroker[LogMessage](), } +type writer struct{} + func (w *writer) Write(p []byte) (int, error) { d := logfmt.NewDecoder(bytes.NewReader(p)) for d.ScanRecord() { @@ -30,7 +59,7 @@ func (w *writer) Write(p []byte) (int, error) { } msg.Time = parsed case "level": - msg.Level = string(d.Value()) + msg.Level = strings.ToLower(string(d.Value())) case "msg": msg.Message = string(d.Value()) default: @@ -50,11 +79,23 @@ func (w *writer) Write(p []byte) (int, error) { } } } - w.messages = append(w.messages, msg) - w.Publish(pubsub.CreatedEvent, msg) + defaultLogData.Add(msg) } if d.Err() != nil { return 0, d.Err() } return len(p), nil } + +func NewWriter() *writer { + w := &writer{} + return w +} + +func Subscribe(ctx context.Context) <-chan pubsub.Event[LogMessage] { + return defaultLogData.Subscribe(ctx) +} + +func List() []LogMessage { + return defaultLogData.List() +} |
