• 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 <processname>-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()")
    }
  • 相关阅读:
    浏览器操作本地缓存记录一下
    dotnet new Getting ready... Object reference not set to an instance of an object.
    IIS上vue打包后接口跨域解决
    SpringBoot前言
    Node聊天室和socket.io原理与功能总结
    Node加解密原理和功能探索总结
    Node中文件断点续传原理和方法总结
    Node短链原理与功能实现总结
    Node中F2A原理及功能实现总结
    Node图形邮箱手机验证码实现方法总结
  • 原文地址:https://www.cnblogs.com/rsapaper/p/15789318.html
Copyright © 2020-2023  润新知