IoWriter4SplitFile 日志分割文件 不同级别的日志 不同的文件
IoWriter.go
package mainimport ( "github.com/natefinch/lumberjack" "io" )
// github.com\natefinch\lumberjack@v2.0.0+incompatible\lumberjack.go
type SplitFileArgs struct { // Filename is the file to write logs to. Backup log files will be retained // in the same directory. It uses
// MaxSize is the maximum size in megabytes of the log file before it gets // rotated. It defaults to 100 megabytes. MaxSize int `json:"maxsize" yaml:"maxsize"`
// MaxAge is the maximum number of days to retain old log files based on the // timestamp encoded in their filename. Note that a day is defined as 24 // hours and may not exactly correspond to calendar days due to daylight // savings, leap seconds, etc. The default is not to remove old log files // based on age. MaxAge int `json:"maxage" yaml:"maxage"`
// MaxBackups is the maximum number of old log files to retain. The default // is to retain all old log files (though MaxAge may still cause them to get // deleted.) MaxBackups int `json:"maxbackups" yaml:"maxbackups"`
// LocalTime determines if the time used for formatting the timestamps in // backup files is the computer's local time. The default is to use UTC // time. LocalTime bool `json:"localtime" yaml:"localtime"`
// Compress determines if the rotated log files should be compressed // using gzip. The default is not to perform compression. Compress bool `json:"compress" yaml:"compress"`
size int64 }
func IoWriter4SplitFile(path string) io.Writer { return &lumberjack.Logger{ Filename: path, MaxSize: 2, MaxBackups: 8, MaxAge: 32, Compress: true, } }
logger.go
package mainimport ( "os"
"go.uber.org/zap" "go.uber.org/zap/zapcore" )
const PathSeparator = string(os.PathSeparator)
var logger *(zap.Logger)
// zap package - go.uber.org/zap - pkg.go.dev https://pkg.go.dev/go.uber.org/zap func init() { // For some users, the presets offered by the NewProduction, NewDevelopment, // and NewExample constructors won't be appropriate. For most of those // users, the bundled Config struct offers the right balance of flexibility // and convenience. (For more complex needs, see the AdvancedConfiguration // example.) // // See the documentation for Config and zapcore.EncoderConfig for all the // available options. // First, define our level-handling logic. highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.ErrorLevel }) lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl < zapcore.ErrorLevel })
en := func() zapcore.EncoderConfig { return zapcore.EncoderConfig{ TimeKey: "ts", LevelKey: "level", NameKey: "logger", CallerKey: "caller", FunctionKey: zapcore.OmitKey, MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } } // zap package - go.uber.org/zap - pkg.go.dev https://pkg.go.dev/go.uber.org/zap // The bundled Config struct only supports the most common configuration // options. More complex needs, like splitting logs between multiple files // or writing to non-file outputs, require use of the zapcore package. coreHighPriority := zapcore.NewCore( zapcore.NewConsoleEncoder(en()), zapcore.NewMultiWriteSyncer( zapcore.AddSync(os.Stdout), zapcore.AddSync(IoWriter4SplitFile("logs"+PathSeparator+"ERROR-"+".log")), ), highPriority) coreLowPriority := zapcore.NewCore( zapcore.NewJSONEncoder(en()), zapcore.NewMultiWriteSyncer( zapcore.AddSync(os.Stdout), zapcore.AddSync(IoWriter4SplitFile("logs"+PathSeparator+"DEBUG-"+".log")), ), lowPriority) opts := []zap.Option{ zap.AddStacktrace(zapcore.WarnLevel), } core := zapcore.NewTee( coreHighPriority, coreLowPriority, ) logger = zap.New(core, opts...) defer logger.Sync() logger.Info("logger construction succeeded") }
调用
package main func main() { logger.Info("cron.New()") }