@@ -3,6 +3,7 @@ package logger
33import (
44 "context"
55 "fmt"
6+ "io"
67 "log/slog"
78 "net/http"
89 "os"
@@ -135,6 +136,48 @@ func New(prefix string) *SlogLogger {
135136 // logger.V(4).Infof("new logger created name=%v flags=%s level=%s", prefix, flags.level, FromSlogLevel(lvl.Level()).String())
136137 return logger
137138}
139+
140+ // NewWithWriter creates a new SlogLogger that writes to the specified writer.
141+ // This is useful for integrating with test frameworks or custom output destinations.
142+ func NewWithWriter (writer io.Writer ) * SlogLogger {
143+ var logger * SlogLogger
144+ var lvl = & slog.LevelVar {}
145+
146+ reportCaller := properties .On (flags .reportCaller , "log.caller" )
147+ logJson := properties .On (flags .jsonLogs , "log.json" )
148+ logColor := properties .On (flags .color , "log.color" )
149+
150+ var rootLevel string
151+ if flags .level != "" {
152+ rootLevel = flags .level
153+ } else {
154+ rootLevel = properties .String ("info" , "log.level" )
155+ }
156+
157+ if logJson {
158+ logger = & SlogLogger {
159+ Level : lvl ,
160+ Logger : slog .New (slog .NewJSONHandler (writer , & slog.HandlerOptions {
161+ AddSource : reportCaller ,
162+ Level : lvl ,
163+ })),
164+ }
165+ } else {
166+ logger = & SlogLogger {
167+ Logger : slog .New (tint .NewHandler (writer , & tint.Options {
168+ Level : lvl ,
169+ NoColor : ! logColor ,
170+ AddSource : reportCaller ,
171+ TimeFormat : properties .String ("15:04:05.999" , "log.time.format" ),
172+ })),
173+ Level : lvl ,
174+ }
175+ }
176+
177+ logger .SetLogLevel (rootLevel )
178+ return logger
179+ }
180+
138181func UseSlog () {
139182 if currentLogger != nil {
140183 return
0 commit comments