IoWriter4SplitFile 日志分割文件 不同级别的日志 不同的文件


IoWriter.go

package main
import (     "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 -lumberjack.log in     // os.TempDir() if empty.     Filename string `json:"filename" yaml:"filename"`
    // 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 main
import (     "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()") }