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. 17
      config.go
  4. 124
      logger.go

0
cmd/logs/cmd.error

15
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....")
}

17
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,
}
}

124
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)

Loading…
Cancel
Save