summaryrefslogtreecommitdiffhomepage
path: root/internal/logging
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-10 13:29:44 +0200
committerKujtim Hoxha <[email protected]>2025-04-10 13:29:44 +0200
commit36f201d5d3aaba7e0285d86cf1c0cf6b54769cff (patch)
tree1f1c99e66df4c25f816fbfba2b1e255c94bec9ba /internal/logging
parent0b007b9c77bc790127021a7e03c8e05ec8e5e081 (diff)
downloadopencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.tar.gz
opencode-36f201d5d3aaba7e0285d86cf1c0cf6b54769cff.zip
fix logs and add cancellation
Diffstat (limited to 'internal/logging')
-rw-r--r--internal/logging/default.go12
-rw-r--r--internal/logging/logger.go136
-rw-r--r--internal/logging/logging.go23
-rw-r--r--internal/logging/writer.go49
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()
+}