2020package logger
2121
2222import (
23+ "fmt"
24+
2325 "go.uber.org/zap"
2426 "go.uber.org/zap/zapcore"
27+ "gopkg.in/natefinch/lumberjack.v2"
2528)
2629
2730var zapLogger * zap.Logger
@@ -36,3 +39,70 @@ func init() {
3639 zapConfig .EncoderConfig .EncodeTime = zapcore .ISO8601TimeEncoder
3740 zapLogger , _ = zapConfig .Build ()
3841}
42+
43+ func getEncoder () zapcore.Encoder {
44+ encoderConfig := zap .NewProductionEncoderConfig ()
45+ encoderConfig .EncodeTime = zapcore .ISO8601TimeEncoder
46+ encoderConfig .EncodeLevel = zapcore .CapitalLevelEncoder
47+ encoderConfig .TimeKey = "time"
48+
49+ return zapcore .NewJSONEncoder (encoderConfig )
50+ }
51+
52+ func getWriteSyncer (filename string , maxBackups , maxAge , maxSize int , compress bool ) (zapcore.WriteSyncer , error ) {
53+ lumberJackLogger := & lumberjack.Logger {
54+ Filename : filename ,
55+ MaxBackups : maxBackups ,
56+ MaxSize : maxSize ,
57+ MaxAge : maxAge ,
58+ Compress : compress ,
59+ }
60+
61+ if _ , err := lumberJackLogger .Write ([]byte ("test logfile writable\r \n " )); err != nil {
62+ return nil , fmt .Errorf ("test writing to log file %s failed" , filename )
63+ }
64+
65+ return zapcore .AddSync (lumberJackLogger ), nil
66+ }
67+
68+ func InitLoggerRotate (level , filename string , maxBackups , maxAge , maxSize int , compress bool ) error {
69+ // if file path is empty, use default zapLogger, print in console
70+ if len (filename ) == 0 {
71+ return nil
72+ }
73+ if level != "info" && level != "warn" && level != "error" {
74+ return fmt .Errorf ("log level must be one of info,warn,error" )
75+ }
76+ if maxBackups > 100 || maxBackups < 10 {
77+ return fmt .Errorf ("log max_backups must be between 10 and 100" )
78+ }
79+ if maxAge > 30 || maxAge < 1 {
80+ return fmt .Errorf ("log max_age must be between 1 and 30" )
81+ }
82+ if maxSize > 500 || maxSize < 100 {
83+ return fmt .Errorf ("log max_size must be between 100 and 500" )
84+ }
85+
86+ var l = new (zapcore.Level )
87+ if err := l .UnmarshalText ([]byte (level )); err != nil {
88+ return err
89+ }
90+ encoder := getEncoder ()
91+ writeSync , err := getWriteSyncer (filename , maxBackups , maxAge , maxSize , compress )
92+ if err != nil {
93+ return err
94+ }
95+ core := zapcore .NewCore (encoder , writeSync , l )
96+ rotateLogger := zap .New (core , zap .AddCaller ())
97+ zapLogger = rotateLogger
98+
99+ return nil
100+ }
101+
102+ func Sync () {
103+ if zapLogger != nil {
104+ if err := zapLogger .Sync (); err != nil {
105+ return
106+ }
107+ }
108+ }
0 commit comments