logger.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package log
  2. import (
  3. "github.com/natefinch/lumberjack"
  4. "go.uber.org/zap"
  5. "go.uber.org/zap/zapcore"
  6. "os"
  7. )
  8. var (
  9. defaultLog *SLogger
  10. )
  11. /// signle logger
  12. /// means log in a single file
  13. /// 默认配置:
  14. /// json 格式
  15. /// 单文件最大 10 m
  16. /// 最多保留1个月
  17. /// 压缩备份
  18. type SLogger struct {
  19. f string
  20. lg *zap.Logger
  21. }
  22. // @console: 是否输出到 console
  23. // @path: 路径
  24. // @level: 日志等级
  25. // @sinks: 日志额外的输出
  26. func NewSLogger(path string, level zapcore.Level, console bool, sinks ...zap.Sink) *SLogger {
  27. settings := lumberjack.Logger{
  28. Filename: path,
  29. MaxSize: 10, //M
  30. MaxAge: 30, //d
  31. MaxBackups: 360,//numbers
  32. Compress: true,
  33. }
  34. encoderConf := zapcore.EncoderConfig{
  35. MessageKey: "msg",
  36. LevelKey: "level",
  37. TimeKey: "ts",
  38. NameKey: "logger",
  39. CallerKey: "caller",
  40. StacktraceKey: "trace",
  41. LineEnding: zapcore.DefaultLineEnding,
  42. EncodeLevel: zapcore.LowercaseLevelEncoder,
  43. EncodeTime: zapcore.ISO8601TimeEncoder,
  44. EncodeDuration: zapcore.SecondsDurationEncoder,
  45. EncodeCaller: zapcore.ShortCallerEncoder,
  46. }
  47. // level
  48. atom := zap.NewAtomicLevelAt(level)
  49. wss := []zapcore.WriteSyncer{zapcore.AddSync(&settings)}
  50. if console {
  51. wss = append(wss, zapcore.AddSync(os.Stdout))
  52. }
  53. for _, sink := range sinks {
  54. wss = append(wss, zapcore.AddSync(sink))
  55. }
  56. // writeSyncer
  57. ws := zapcore.NewMultiWriteSyncer(wss...)
  58. // core
  59. core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderConf),
  60. ws,
  61. atom)
  62. caller := zap.AddCaller()
  63. callerSkip := zap.AddCallerSkip(2)
  64. dev := zap.Development()
  65. stack := zap.AddStacktrace(zapcore.ErrorLevel)
  66. logger := zap.New(core, caller, callerSkip, dev, stack)
  67. return &SLogger{
  68. f: path,
  69. lg: logger,
  70. }
  71. }
  72. func (self *SLogger) Debug(msg string, fields ...zap.Field) {
  73. self.lg.Debug(msg, fields...)
  74. }
  75. func (self *SLogger) Info(msg string, fields ...zap.Field) {
  76. self.lg.Info(msg, fields...)
  77. }
  78. func (self *SLogger) Warn(msg string, fields ...zap.Field) {
  79. self.lg.Warn(msg, fields...)
  80. }
  81. func (self *SLogger) Error(msg string, fields ...zap.Field) {
  82. self.lg.Error(msg, fields...)
  83. }
  84. func (self *SLogger) Panic(msg string, fields ...zap.Field) {
  85. self.lg.Panic(msg, fields...)
  86. }
  87. func (self *SLogger) Fatal(msg string, fields ...zap.Field) {
  88. self.lg.Fatal(msg, fields...)
  89. }
  90. func (self *SLogger) Sync() {
  91. _ = self.lg.Sync()
  92. }
  93. func SetDefaultLogger(logger *SLogger) {
  94. defaultLog = logger
  95. }
  96. func Debug(msg string, fields ...zap.Field) {
  97. defaultLog.Debug(msg, fields...)
  98. }
  99. func Info(msg string, fields ...zap.Field) {
  100. defaultLog.Info(msg, fields...)
  101. }
  102. func Warn(msg string, fields ...zap.Field) {
  103. defaultLog.Warn(msg, fields...)
  104. }
  105. func Error(msg string, fields ...zap.Field) {
  106. defaultLog.Error(msg, fields...)
  107. }
  108. func Panic(msg string, fields ...zap.Field) {
  109. defaultLog.Panic(msg, fields...)
  110. }
  111. func Fatal(msg string, fields ...zap.Field) {
  112. defaultLog.Fatal(msg, fields...)
  113. }
  114. func Sync() {
  115. defaultLog.Sync()
  116. }