2023-05-13 01:27:48 +08:00
|
|
|
|
package inits
|
2023-02-03 16:18:31 +08:00
|
|
|
|
|
|
|
|
|
import (
|
2023-05-13 00:55:47 +08:00
|
|
|
|
"demo-server/internal/config"
|
|
|
|
|
"demo-server/internal/config/logger"
|
2023-02-03 16:18:31 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"go.uber.org/zap/zapcore"
|
|
|
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
logger 使用规范
|
|
|
|
|
1. 执行频次有限的可以使用 sugar
|
|
|
|
|
2. 业务主流程上的,并发度较高的部分使用 zap.L()
|
|
|
|
|
3. 日志分级
|
|
|
|
|
- info 关键路径上使用要克制数量
|
|
|
|
|
- err 影响关键业务继续执行的报 err
|
|
|
|
|
- warn 非关键可继续执行流程的部分 err
|
|
|
|
|
*/
|
|
|
|
|
|
2023-05-13 00:55:47 +08:00
|
|
|
|
func initLogger() error {
|
|
|
|
|
cfg := config.Get().Log
|
2023-02-03 16:18:31 +08:00
|
|
|
|
if cfg == nil {
|
|
|
|
|
return ErrorInitFundamental
|
|
|
|
|
}
|
|
|
|
|
enConfig := zap.NewProductionEncoderConfig()
|
|
|
|
|
enConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
|
|
|
|
//enConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
|
|
|
|
enConfig.EncodeLevel = zapcore.CapitalLevelEncoder
|
|
|
|
|
|
|
|
|
|
var cores []zapcore.Core
|
|
|
|
|
|
|
|
|
|
switch cfg.Level {
|
|
|
|
|
case zapcore.InfoLevel.String():
|
|
|
|
|
cores = append(cores, buildZapCore(cfg, zapcore.InfoLevel, enConfig, zapcore.InfoLevel))
|
|
|
|
|
case zapcore.WarnLevel.String():
|
|
|
|
|
cores = append(cores, buildZapCore(cfg, zapcore.WarnLevel, enConfig, zapcore.WarnLevel))
|
|
|
|
|
default:
|
|
|
|
|
cores = append(cores, buildZapCore(cfg, zapcore.DebugLevel, enConfig, zapcore.DebugLevel))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 控制台使用 color encoder
|
|
|
|
|
if cfg.LogInConsole {
|
|
|
|
|
enConfigStd := zap.NewProductionEncoderConfig()
|
|
|
|
|
enConfigStd.EncodeTime = zapcore.ISO8601TimeEncoder
|
|
|
|
|
enConfigStd.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
|
|
|
|
|
|
|
|
|
switch cfg.Level {
|
|
|
|
|
case zapcore.InfoLevel.String():
|
|
|
|
|
cores = append(cores, buildZapCoreStd(zapcore.InfoLevel, enConfigStd, zapcore.InfoLevel))
|
|
|
|
|
case zapcore.WarnLevel.String():
|
|
|
|
|
cores = append(cores, buildZapCoreStd(zapcore.WarnLevel, enConfigStd, zapcore.WarnLevel))
|
|
|
|
|
default:
|
|
|
|
|
cores = append(cores, buildZapCoreStd(zapcore.DebugLevel, enConfigStd, zapcore.DebugLevel))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cores = append(cores, buildZapCore(cfg, zapcore.ErrorLevel, enConfig, zapcore.ErrorLevel))
|
|
|
|
|
zapLogger := zap.New(zapcore.NewTee(cores...), zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
|
|
|
|
|
zap.ReplaceGlobals(zapLogger)
|
|
|
|
|
|
|
|
|
|
logWelcomeInfo()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// todo output version
|
|
|
|
|
// now: output config path in use
|
|
|
|
|
func logWelcomeInfo() {
|
|
|
|
|
zap.S().Infof("welcome, app[pp/pid: %d/%d] init form %s", os.Getppid(), os.Getpid(), viper.ConfigFileUsed())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func buildZapCore(config *logger.Config, level zapcore.Level, enConfig zapcore.EncoderConfig, enabler zapcore.LevelEnabler) zapcore.Core {
|
|
|
|
|
writer := &lumberjack.Logger{
|
|
|
|
|
Filename: fmt.Sprintf(config.Path + level.String() + logger.FileSufferFix),
|
|
|
|
|
MaxSize: config.MaxSize,
|
|
|
|
|
MaxAge: config.MaxAge,
|
|
|
|
|
MaxBackups: config.MaxBackups,
|
|
|
|
|
Compress: config.Compress,
|
|
|
|
|
LocalTime: config.LocalTime,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var writeSyncer zapcore.WriteSyncer
|
|
|
|
|
writeSyncer = zapcore.AddSync(writer)
|
|
|
|
|
return zapcore.NewCore(zapcore.NewConsoleEncoder(enConfig), writeSyncer, enabler)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func buildZapCoreStd(level zapcore.Level, enConfig zapcore.EncoderConfig, enabler zapcore.LevelEnabler) zapcore.Core {
|
|
|
|
|
var writeSyncer zapcore.WriteSyncer
|
|
|
|
|
writeSyncer = zapcore.AddSync(os.Stdin)
|
|
|
|
|
|
|
|
|
|
return zapcore.NewCore(zapcore.NewConsoleEncoder(enConfig), writeSyncer, enabler)
|
|
|
|
|
}
|