1
1
package logwise
2
2
3
3
import (
4
- "context"
5
4
"log/slog"
5
+ "net/url"
6
6
"time"
7
7
8
- slogzap "github.com/samber/slog-zap/v2"
9
8
"go.uber.org/zap"
9
+ "go.uber.org/zap/exp/zapslog"
10
10
"go.uber.org/zap/zapcore"
11
11
"gopkg.in/natefinch/lumberjack.v2"
12
12
)
13
13
14
- // Discard is a [Handler] which is always disabled and therefore logs nothing.
15
- var Discard slog.Handler = discardHandler {}
16
-
17
- var LogLevels = map [zapcore.Level ]slog.Level {
18
- zapcore .DebugLevel : slog .LevelDebug ,
19
- zapcore .InfoLevel : slog .LevelInfo ,
20
- zapcore .WarnLevel : slog .LevelWarn ,
21
- zapcore .ErrorLevel : slog .LevelError ,
22
- zapcore .DPanicLevel : slog .LevelError ,
23
- zapcore .PanicLevel : slog .LevelError ,
24
- zapcore .FatalLevel : slog .LevelError ,
25
- }
26
-
27
- func NewSlog (logger * zap.Logger ) * slog.Logger {
28
- option := slogzap.Option {
29
- Level : LogLevels [logger .Level ()],
30
- Logger : logger .WithOptions (zap .AddCallerSkip (1 )),
31
- }
32
- return slog .New (option .NewZapHandler ())
14
+ func NewSlog (logger zapcore.Core ) * slog.Logger {
15
+ return slog .New (zapslog .NewHandler (logger , zapslog .WithCallerSkip (1 )))
33
16
}
34
17
35
18
func NewZap (cfg Config ) (* zap.Logger , error ) {
36
19
cfg .setDefaults ()
37
20
21
+ if cfg .RollingLogger != nil {
22
+ if err := zap .RegisterSink ("rolling" , syncFactory (* cfg .RollingLogger )); err != nil {
23
+ return nil , err
24
+ }
25
+ }
26
+
38
27
var zCfg zap.Config
39
28
switch cfg .Mode {
40
29
case off , none :
@@ -119,25 +108,32 @@ func NewZap(cfg Config) (*zap.Logger, error) {
119
108
}
120
109
}
121
110
122
- if cfg .FileLogger != nil {
123
- w := zapcore .AddSync (& lumberjack.Logger {
124
- Filename : cfg .FileLogger .Filename ,
125
- MaxSize : cfg .FileLogger .MaxSize ,
126
- MaxAge : cfg .FileLogger .MaxAge ,
127
- MaxBackups : cfg .FileLogger .MaxBackups ,
128
- LocalTime : cfg .FileLogger .LocalTime ,
129
- Compress : cfg .FileLogger .Compress ,
130
- })
111
+ return zCfg .Build ()
112
+ }
113
+
114
+ type sync struct {
115
+ * lumberjack.Logger
116
+ }
131
117
132
- core := zapcore .NewCore (
133
- zapcore .NewJSONEncoder (zCfg .EncoderConfig ),
134
- w ,
135
- zCfg .Level ,
136
- )
137
- return zap .New (core ), nil
138
- }
118
+ func (* sync ) Sync () error {
119
+ return nil
120
+ }
139
121
140
- return zCfg .Build ()
122
+ func syncFactory (cfg RollingLoggerConfig ) func (* url.URL ) (zap.Sink , error ) {
123
+ return func (u * url.URL ) (zap.Sink , error ) {
124
+ filename := u .Path
125
+ if u .Host == "." || u .Path == "" {
126
+ filename = u .Host + u .Path
127
+ }
128
+ return & sync {& lumberjack.Logger {
129
+ Filename : filename ,
130
+ MaxSize : cfg .MaxSize ,
131
+ MaxAge : cfg .MaxAge ,
132
+ MaxBackups : cfg .MaxBackups ,
133
+ LocalTime : cfg .LocalTime ,
134
+ Compress : cfg .Compress ,
135
+ }}, nil
136
+ }
141
137
}
142
138
143
139
func level (lvl string ) zap.AtomicLevel {
@@ -153,10 +149,3 @@ func utcISO8601TimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
153
149
func utcEpochTimeEncoder (t time.Time , enc zapcore.PrimitiveArrayEncoder ) {
154
150
enc .AppendInt64 (t .UTC ().UnixNano ())
155
151
}
156
-
157
- type discardHandler struct {}
158
-
159
- func (discardHandler ) Enabled (context.Context , slog.Level ) bool { return false }
160
- func (discardHandler ) Handle (context.Context , slog.Record ) error { return nil }
161
- func (d discardHandler ) WithAttrs ([]slog.Attr ) slog.Handler { return d }
162
- func (d discardHandler ) WithGroup (string ) slog.Handler { return d }
0 commit comments