11package logger
22
33import (
4+ "fmt"
5+ "os"
6+ "path/filepath"
47 "time"
58
69 "github.com/gin-gonic/gin"
10+ "github.com/uozi-tech/cosy/settings"
711 "go.uber.org/zap/zapcore"
12+ "gopkg.in/natefinch/lumberjack.v2"
813)
914
1015func GetFileEncoder (mode string ) zapcore.Encoder {
@@ -31,3 +36,66 @@ func GetFileEncoder(mode string) zapcore.Encoder {
3136
3237 return zapcore .NewJSONEncoder (encoderConfig )
3338}
39+
40+ // NewFileCores builds zap cores with size-based log rotation.
41+ // Error and above go to error.log; lower levels go to info.log.
42+ func NewFileCores (mode string , highPriority , lowPriority zapcore.LevelEnabler ) ([]zapcore.Core , error ) {
43+ if err := os .MkdirAll (settings .LogSettings .Dir , 0755 ); err != nil {
44+ return nil , fmt .Errorf ("create log directory: %w" , err )
45+ }
46+
47+ encoder := GetFileEncoder (mode )
48+
49+ var (
50+ errorSyncer zapcore.WriteSyncer
51+ infoSyncer zapcore.WriteSyncer
52+ err error
53+ )
54+
55+ if settings .LogSettings .EnableRotate {
56+ errorSyncer = newRotateWriteSyncer (filepath .Join (settings .LogSettings .Dir , "error.log" ))
57+ infoSyncer = newRotateWriteSyncer (filepath .Join (settings .LogSettings .Dir , "info.log" ))
58+ } else {
59+ errorSyncer , err = newPlainWriteSyncer (filepath .Join (settings .LogSettings .Dir , "error.log" ))
60+ if err != nil {
61+ return nil , fmt .Errorf ("open error log file: %w" , err )
62+ }
63+ infoSyncer , err = newPlainWriteSyncer (filepath .Join (settings .LogSettings .Dir , "info.log" ))
64+ if err != nil {
65+ return nil , fmt .Errorf ("open info log file: %w" , err )
66+ }
67+ }
68+
69+ errorCore := zapcore .NewCore (
70+ encoder ,
71+ errorSyncer ,
72+ highPriority ,
73+ )
74+
75+ infoCore := zapcore .NewCore (
76+ encoder ,
77+ infoSyncer ,
78+ lowPriority ,
79+ )
80+
81+ return []zapcore.Core {errorCore , infoCore }, nil
82+ }
83+
84+ func newRotateWriteSyncer (filename string ) zapcore.WriteSyncer {
85+ return zapcore .AddSync (& lumberjack.Logger {
86+ Filename : filename ,
87+ MaxSize : settings .LogSettings .MaxSize ,
88+ MaxBackups : settings .LogSettings .MaxBackups ,
89+ MaxAge : settings .LogSettings .MaxAge ,
90+ LocalTime : true ,
91+ Compress : settings .LogSettings .Compress ,
92+ })
93+ }
94+
95+ func newPlainWriteSyncer (filename string ) (zapcore.WriteSyncer , error ) {
96+ f , err := os .OpenFile (filename , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0o644 )
97+ if err != nil {
98+ return nil , err
99+ }
100+ return zapcore .AddSync (f ), nil
101+ }
0 commit comments