Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/searKing/golang/go v1.2.138 // indirect
github.com/sergi/go-diff v1.2.0 // indirect
github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
Expand All @@ -80,6 +81,7 @@ require (
github.com/yudai/pp v2.0.1+incompatible // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/term v0.30.0 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,8 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/searKing/golang/go v1.2.138 h1:Q53UC295VzOqCwNkpabwgU60wu1KlsmxdkFYHfEMDZI=
github.com/searKing/golang/go v1.2.138/go.mod h1:IeVG9+PUi6BP5Snxrd1LahoLjxwNIJdycu9M1jq6gos=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
Expand Down Expand Up @@ -748,6 +750,8 @@ golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
83 changes: 81 additions & 2 deletions logger/glog.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
package logger

import (
"context"
"log/slog"
"os"

"github.com/golang/glog"
slogglog "github.com/searKing/golang/go/log/slog"
)

// GlogLogger implements the Logger interface for logging using the glog library with configurable call depth.
// It also provides slog-compatible methods through an embedded slog.Logger that uses a glog handler.
type GlogLogger struct {
depth int
depth int
slogLogger *slog.Logger
exitFunc func(int) // allows testing Fatal without actually exiting
}

// Debug logs a debug-level message with the specified format and arguments.
Expand Down Expand Up @@ -35,7 +43,78 @@ func (logger *GlogLogger) Fatalf(msg string, args ...any) {
}

func NewGlogLogger() Logger {
// Create a glog handler that writes to stderr (matching glog's default behavior)
handler := slogglog.NewGlogHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelDebug, // Allow all levels, glog will handle filtering
})

// Capture the default level-to-prefix mapping
defaultReplaceLevelString := handler.ReplaceLevelString

// Customize to add "F" for Fatal level, delegating to default for others
handler.ReplaceLevelString = func(l slog.Level) string {
if l >= LevelFatal {
return "F" // Fatal (for LevelFatal and above)
}
return defaultReplaceLevelString(l) // Use default mapping for D/I/W/E
}

return &GlogLogger{
depth: 1,
depth: 1,
slogLogger: slog.New(handler),
exitFunc: os.Exit, // default to os.Exit, can be overridden for testing
}
}

// StructuredLogger interface implementation

// Debug logs at Debug level using slog
func (logger *GlogLogger) Debug(msg string, args ...any) {
logger.DebugContext(context.Background(), msg, args...)
}

// DebugContext logs at Debug level with context using slog
func (logger *GlogLogger) DebugContext(ctx context.Context, msg string, args ...any) {
logger.slogLogger.DebugContext(ctx, msg, args...)
}

// Info logs at Info level using slog
func (logger *GlogLogger) Info(msg string, args ...any) {
logger.InfoContext(context.Background(), msg, args...)
}

// InfoContext logs at Info level with context using slog
func (logger *GlogLogger) InfoContext(ctx context.Context, msg string, args ...any) {
logger.slogLogger.InfoContext(ctx, msg, args...)
}

// Warn logs at Warn level using slog
func (logger *GlogLogger) Warn(msg string, args ...any) {
logger.WarnContext(context.Background(), msg, args...)
}

// WarnContext logs at Warn level with context using slog
func (logger *GlogLogger) WarnContext(ctx context.Context, msg string, args ...any) {
logger.slogLogger.WarnContext(ctx, msg, args...)
}

// Error logs at Error level using slog
func (logger *GlogLogger) Error(msg string, args ...any) {
logger.ErrorContext(context.Background(), msg, args...)
}

// ErrorContext logs at Error level with context using slog
func (logger *GlogLogger) ErrorContext(ctx context.Context, msg string, args ...any) {
logger.slogLogger.ErrorContext(ctx, msg, args...)
}

// Fatal logs at Fatal level using slog and terminates the program
func (logger *GlogLogger) Fatal(msg string, args ...any) {
logger.FatalContext(context.Background(), msg, args...)
}

// FatalContext logs at Fatal level with context using slog and terminates the program
func (logger *GlogLogger) FatalContext(ctx context.Context, msg string, args ...any) {
logger.slogLogger.Log(ctx, LevelFatal, msg, args...)
logger.exitFunc(1)
}
Loading
Loading