From c7cc9fe243383b89e0ac6acecf661a5d515f8bd2 Mon Sep 17 00:00:00 2001 From: frank Date: Wed, 11 Jan 2023 09:24:28 +0800 Subject: [PATCH] rotation --- cmd/logs/cmd.error | 0 cmd/print.go | 15 +++++- config.go | 17 +++++-- logger.go | 124 ++++++++++++++++++++++++++++++++++++--------- 4 files changed, 126 insertions(+), 30 deletions(-) delete mode 100644 cmd/logs/cmd.error diff --git a/cmd/logs/cmd.error b/cmd/logs/cmd.error deleted file mode 100644 index e69de29..0000000 diff --git a/cmd/print.go b/cmd/print.go index c69787b..b9ee1ec 100644 --- a/cmd/print.go +++ b/cmd/print.go @@ -1,11 +1,22 @@ package main -import "git.drinkme.beer/yinghe/log" +import ( + "git.drinkme.beer/yinghe/log" + "time" +) func main() { log.Infof("hahah") log.ReloadLogger("./conf/cfg.toml") log.Infof(" reloaded.") - return + + now := time.Now() + log.RotateLogger(log.New(`./logs/cmd.`+now.Format(time.RFC3339), `./logs/cmd`)) + log.Info("ping") + log.RotateLogger(log.New(`./logs/cmd.`+now.Format(time.RFC3339), `./logs/cmd`)) + log.Infof("pong") + + log.RotateLogger(log.New(`./logs/cmd.`+now.Add(time.Hour).Format(time.RFC3339), `./logs/cmd`)) + log.Infof("one hour later....") } diff --git a/config.go b/config.go index 1d98027..7e0e3c1 100644 --- a/config.go +++ b/config.go @@ -1,9 +1,11 @@ package log type LogCfg struct { - LogConf string `toml:"conf"` - LogPath string `toml:"path"` - APPName string `toml:"app_name"` + LogConf string `toml:"conf"` + LogPath string `toml:"path"` + LogInfoPath string `toml:"path_info"` + LogErrPath string `toml:"path_err"` + APPName string `toml:"app_name"` DInfo string DError string @@ -15,9 +17,14 @@ type GlobalCfg struct { Logs LogCfg `toml:"logger"` } -var cfg LogCfg - const ( // ConfigFile is the default configuration file name. ConfigFile = "./conf/cfg.toml" ) + +func New(infoPath, errPath string) LogCfg { + return LogCfg{ + LogInfoPath: infoPath, + LogErrPath: errPath, + } +} diff --git a/logger.go b/logger.go index 5c8904f..0db06f5 100644 --- a/logger.go +++ b/logger.go @@ -1,9 +1,12 @@ package log import ( + "errors" "fmt" + "io/fs" "io/ioutil" "log" + "os" "path" "github.com/BurntSushi/toml" @@ -37,7 +40,8 @@ type Logger interface { func init() { var ( - logCfg GlobalCfg + cfg LogCfg + logCfg GlobalCfg ) log.Println("config file name -->", ConfigFile) @@ -45,7 +49,7 @@ func init() { if _, err := toml.DecodeFile(ConfigFile, &logCfg); err != nil { //log.Fatalf("Read config file err:%s", err.Error()) log.Println("failed to open config file") - if err = InitLog(""); nil != err { + if err = InitLog("", cfg); nil != err { log.Println(err.Error()) } return @@ -55,16 +59,16 @@ func init() { cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log" cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error" - err := InitLog(cfg.LogConf) + err := InitLog(cfg.LogConf, cfg) if err != nil { log.Printf("[InitLog] warn: %v", err) } } func ReloadLogger(configFile string) { - var ( - logCfg GlobalCfg + cfg LogCfg + logCfg GlobalCfg ) log.Println("config file name -->", configFile) @@ -72,43 +76,117 @@ func ReloadLogger(configFile string) { log.Fatalf("Read config file err:%s", err.Error()) } cfg = logCfg.Logs - cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log" cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error" - err := InitLog(cfg.LogConf) + err := InitLog(cfg.LogConf, cfg) if err != nil { log.Printf("[ReloadLogger] warn: %v", err) } } -func InitLog(logConfFile string) error { - if logConfFile == "" { - InitLogger(nil) - return fmt.Errorf("log configure file name is nil") - } - if path.Ext(logConfFile) != ".yml" { - InitLogger(nil) - return fmt.Errorf("log configure file name{%s} suffix must be .yml", logConfFile) +func RotateLogger(cfg LogCfg) { + cfg.OutputPaths = cfg.LogInfoPath + cfg.APPName + ".log" + cfg.ErrorOutputPaths = cfg.LogErrPath + cfg.APPName + ".error" + if _, err := os.Stat(cfg.OutputPaths); errors.Is(err, fs.ErrNotExist) { + if _, err = os.Create(cfg.OutputPaths); nil != err { + log.Printf("[RotateLogger] error: %s", err.Error()) + return + } } - - confFileStream, err := ioutil.ReadFile(logConfFile) + //if _, err := os.Stat(cfg.ErrorOutputPaths); errors.Is(err, fs.ErrNotExist) { + // if _, err = os.Create(cfg.ErrorOutputPaths); nil != err { + // log.Printf("[RotateLogger] error: %s", err.Error()) + // return + // } + //} + err := InitLog(cfg.LogConf, cfg) if err != nil { - InitLogger(nil) - return fmt.Errorf("ioutil.ReadFile(file:%s) = error:%v", logConfFile, err) + log.Printf("[RotateLogger] warn: %v", err) } +} +var defaultZapConfig = []byte(` +level: "info" +development: false +disableCaller: false +disableStacktrace: false +sampling: +encoding: "console" + +# encoder +encoderConfig: + messageKey: "message" + levelKey: "level" + timeKey: "time" + nameKey: "logger" + callerKey: "caller" + stacktraceKey: "stacktrace" + lineEnding: "" + # levelEncoder: "capitalColor" + timeEncoder: "iso8601" + durationEncoder: "seconds" + callerEncoder: "short" + nameEncoder: "" +`) + +func InitLog(logConfFile string, cfg LogCfg) error { conf := &zap.Config{} - err = yaml.Unmarshal(confFileStream, conf) - if err != nil { - InitLogger(nil) - return fmt.Errorf("[Unmarshal]init logger error: %v", err) + if logConfFile != "" { + //InitLogger(nil) + //return fmt.Errorf("log configure file name is nil") + if path.Ext(logConfFile) != ".yml" { + InitLogger(nil) + return fmt.Errorf("log configure file name{%s} suffix must be .yml", logConfFile) + } + + confFileStream, err := ioutil.ReadFile(logConfFile) + if err != nil { + InitLogger(nil) + return fmt.Errorf("ioutil.ReadFile(file:%s) = error:%v", logConfFile, err) + } + + err = yaml.Unmarshal(confFileStream, conf) + if err != nil { + InitLogger(nil) + return fmt.Errorf("[Unmarshal]init logger error: %v", err) + } + } else { + conf = &zap.Config{ + Level: zap.NewAtomicLevel(), + Development: false, + DisableCaller: false, + DisableStacktrace: false, + Sampling: nil, + Encoding: "console", + EncoderConfig: zapcore.EncoderConfig{ + MessageKey: "message", + LevelKey: "level", + TimeKey: "time", + NameKey: "logger", + CallerKey: "caller", + StacktraceKey: "stacktrace", + LineEnding: "", + EncodeLevel: zapcore.LowercaseLevelEncoder, + EncodeTime: zapcore.EpochMillisTimeEncoder, + EncodeDuration: zapcore.SecondsDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + EncodeName: nil, + }, + } + + err := yaml.Unmarshal(defaultZapConfig, conf) + if err != nil { + InitLogger(nil) + return fmt.Errorf("[Unmarshal]init logger error: %v", err) + } } log.Println("to set yuanex logger ...") conf.OutputPaths = append(conf.OutputPaths, cfg.OutputPaths) conf.ErrorOutputPaths = append(conf.ErrorOutputPaths, cfg.ErrorOutputPaths) + log.Println("OutputPahts -->", conf.OutputPaths) log.Println("ErrorOutputPahts -->", conf.ErrorOutputPaths) InitLogger(conf)