Browse Source

rotation

master v0.1.5
frank 2 years ago
parent
commit
c7cc9fe243
  1. 0
      cmd/logs/cmd.error
  2. 15
      cmd/print.go
  3. 11
      config.go
  4. 98
      logger.go

0
cmd/logs/cmd.error

15
cmd/print.go

@ -1,11 +1,22 @@
package main package main
import "git.drinkme.beer/yinghe/log"
import (
"git.drinkme.beer/yinghe/log"
"time"
)
func main() { func main() {
log.Infof("hahah") log.Infof("hahah")
log.ReloadLogger("./conf/cfg.toml") log.ReloadLogger("./conf/cfg.toml")
log.Infof(" reloaded.") 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....")
} }

11
config.go

@ -3,6 +3,8 @@ package log
type LogCfg struct { type LogCfg struct {
LogConf string `toml:"conf"` LogConf string `toml:"conf"`
LogPath string `toml:"path"` LogPath string `toml:"path"`
LogInfoPath string `toml:"path_info"`
LogErrPath string `toml:"path_err"`
APPName string `toml:"app_name"` APPName string `toml:"app_name"`
DInfo string DInfo string
@ -15,9 +17,14 @@ type GlobalCfg struct {
Logs LogCfg `toml:"logger"` Logs LogCfg `toml:"logger"`
} }
var cfg LogCfg
const ( const (
// ConfigFile is the default configuration file name. // ConfigFile is the default configuration file name.
ConfigFile = "./conf/cfg.toml" ConfigFile = "./conf/cfg.toml"
) )
func New(infoPath, errPath string) LogCfg {
return LogCfg{
LogInfoPath: infoPath,
LogErrPath: errPath,
}
}

98
logger.go

@ -1,9 +1,12 @@
package log package log
import ( import (
"errors"
"fmt" "fmt"
"io/fs"
"io/ioutil" "io/ioutil"
"log" "log"
"os"
"path" "path"
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
@ -37,6 +40,7 @@ type Logger interface {
func init() { func init() {
var ( var (
cfg LogCfg
logCfg GlobalCfg logCfg GlobalCfg
) )
@ -45,7 +49,7 @@ func init() {
if _, err := toml.DecodeFile(ConfigFile, &logCfg); err != nil { if _, err := toml.DecodeFile(ConfigFile, &logCfg); err != nil {
//log.Fatalf("Read config file err:%s", err.Error()) //log.Fatalf("Read config file err:%s", err.Error())
log.Println("failed to open config file") log.Println("failed to open config file")
if err = InitLog(""); nil != err {
if err = InitLog("", cfg); nil != err {
log.Println(err.Error()) log.Println(err.Error())
} }
return return
@ -55,15 +59,15 @@ func init() {
cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log" cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log"
cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error" cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error"
err := InitLog(cfg.LogConf)
err := InitLog(cfg.LogConf, cfg)
if err != nil { if err != nil {
log.Printf("[InitLog] warn: %v", err) log.Printf("[InitLog] warn: %v", err)
} }
} }
func ReloadLogger(configFile string) { func ReloadLogger(configFile string) {
var ( var (
cfg LogCfg
logCfg GlobalCfg logCfg GlobalCfg
) )
@ -72,21 +76,65 @@ func ReloadLogger(configFile string) {
log.Fatalf("Read config file err:%s", err.Error()) log.Fatalf("Read config file err:%s", err.Error())
} }
cfg = logCfg.Logs cfg = logCfg.Logs
cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log" cfg.OutputPaths = cfg.LogPath + cfg.APPName + ".log"
cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error" cfg.ErrorOutputPaths = cfg.LogPath + cfg.APPName + ".error"
err := InitLog(cfg.LogConf)
err := InitLog(cfg.LogConf, cfg)
if err != nil { if err != nil {
log.Printf("[ReloadLogger] warn: %v", err) log.Printf("[ReloadLogger] warn: %v", err)
} }
} }
func InitLog(logConfFile string) error {
if logConfFile == "" {
InitLogger(nil)
return fmt.Errorf("log configure file name is nil")
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
}
}
//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 {
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{}
if logConfFile != "" {
//InitLogger(nil)
//return fmt.Errorf("log configure file name is nil")
if path.Ext(logConfFile) != ".yml" { if path.Ext(logConfFile) != ".yml" {
InitLogger(nil) InitLogger(nil)
return fmt.Errorf("log configure file name{%s} suffix must be .yml", logConfFile) return fmt.Errorf("log configure file name{%s} suffix must be .yml", logConfFile)
@ -98,17 +146,47 @@ func InitLog(logConfFile string) error {
return fmt.Errorf("ioutil.ReadFile(file:%s) = error:%v", logConfFile, err) return fmt.Errorf("ioutil.ReadFile(file:%s) = error:%v", logConfFile, err)
} }
conf := &zap.Config{}
err = yaml.Unmarshal(confFileStream, conf) err = yaml.Unmarshal(confFileStream, conf)
if err != nil { if err != nil {
InitLogger(nil) InitLogger(nil)
return fmt.Errorf("[Unmarshal]init logger error: %v", err) 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 ...") log.Println("to set yuanex logger ...")
conf.OutputPaths = append(conf.OutputPaths, cfg.OutputPaths) conf.OutputPaths = append(conf.OutputPaths, cfg.OutputPaths)
conf.ErrorOutputPaths = append(conf.ErrorOutputPaths, cfg.ErrorOutputPaths) conf.ErrorOutputPaths = append(conf.ErrorOutputPaths, cfg.ErrorOutputPaths)
log.Println("OutputPahts -->", conf.OutputPaths)
log.Println("ErrorOutputPahts -->", conf.ErrorOutputPaths) log.Println("ErrorOutputPahts -->", conf.ErrorOutputPaths)
InitLogger(conf) InitLogger(conf)

Loading…
Cancel
Save