@@ -21,8 +21,14 @@ package log
2121import (
2222 "context"
2323 "fmt"
24+ "log"
25+ "log/slog"
2426 "os"
27+ "strings"
2528 "sync/atomic"
29+ "time"
30+
31+ "github.com/golang-cz/devslog"
2632)
2733
2834// Severity is the severity of the log message.
@@ -37,6 +43,11 @@ const (
3743 SevFatal
3844)
3945
46+ var (
47+ LogLevel = "info" // The logging level for slog. Valid values are `debug`, `info`, `warn` or `error`. Default is `info`.
48+ LogKind = "text" // The logging format for slog. Valid values are `dev', 'json', or 'text'. Default is `text`.
49+ )
50+
4051// Logger is a context-aware logging backend. The richer context allows for
4152// more sophisticated logging setups. Must be concurrency safe.
4253type Logger interface {
@@ -54,7 +65,7 @@ type concreteLogger struct {
5465}
5566
5667func init () {
57- logger .Store (& concreteLogger {& Standard {}})
68+ logger .Store (& concreteLogger {& Structural {}})
5869}
5970
6071// SetLogger sets the global Logger. Intended to be called during initialization
@@ -190,3 +201,51 @@ func Exitln(ctx context.Context, v ...any) {
190201 Output (ctx , SevFatal , 1 , fmt .Sprintln (v ... ))
191202 os .Exit (1 )
192203}
204+
205+ func SetupLoggingWithDefault () {
206+ var logLevel = new (slog.LevelVar )
207+ var logHandler slog.Handler
208+ loggerOutput := os .Stderr
209+ handlerOpts := & slog.HandlerOptions {
210+ Level : logLevel ,
211+ }
212+ switch strings .ToLower (LogLevel ) {
213+ case "debug" :
214+ logLevel .Set (slog .LevelDebug )
215+ handlerOpts .AddSource = true
216+ case "info" :
217+ logLevel .Set (slog .LevelInfo )
218+ case "warn" :
219+ logLevel .Set (slog .LevelWarn )
220+ case "error" :
221+ logLevel .Set (slog .LevelError )
222+ default :
223+ log .Fatalf ("Invalid value for log_level: %v, must be 'debug', 'info', 'warn', or 'error'" , LogLevel )
224+ }
225+ switch strings .ToLower (LogKind ) {
226+ case "dev" :
227+ logHandler =
228+ devslog .NewHandler (loggerOutput , & devslog.Options {
229+ TimeFormat : "[" + time .RFC3339Nano + "]" ,
230+ StringerFormatter : true ,
231+ HandlerOptions : handlerOpts ,
232+ StringIndentation : false ,
233+ NewLineAfterLog : true ,
234+ MaxErrorStackTrace : 3 ,
235+ })
236+ case "json" :
237+ logHandler = slog .NewJSONHandler (loggerOutput , handlerOpts )
238+ case "text" :
239+ logHandler = slog .NewTextHandler (loggerOutput , handlerOpts )
240+ default :
241+ log .Fatalf ("Invalid value for log_kind: %v, must be 'dev', 'json', or 'text'" , LogKind )
242+ }
243+
244+ slog .SetDefault (slog .New (logHandler ))
245+ }
246+
247+ func SetupLogging (logLevel , logKind string ) {
248+ LogLevel = logLevel
249+ LogKind = logKind
250+ SetupLoggingWithDefault ()
251+ }
0 commit comments