logger.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package log
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/natefinch/lumberjack"
  6. "go.uber.org/zap"
  7. "go.uber.org/zap/zapcore"
  8. )
  9. var (
  10. defaultLog *SLogger
  11. defaultErr *SLogger
  12. defaultWarn *SLogger
  13. defLevel = zapcore.InfoLevel
  14. defMaxSize = 10
  15. defMaxAge = 30
  16. defMaxBackups = 360
  17. defCompressing = true
  18. levelMap = map[string]zapcore.Level{
  19. "trace": zapcore.DebugLevel,
  20. "debug": zapcore.DebugLevel,
  21. "info": zapcore.InfoLevel,
  22. "warning": zapcore.WarnLevel,
  23. "error": zapcore.ErrorLevel,
  24. "panic": zapcore.PanicLevel,
  25. "fatal": zapcore.FatalLevel,
  26. }
  27. )
  28. type SLoggerOption func(*SLogger)
  29. func SLoggerWithSinks(sinks ...zap.Sink) SLoggerOption {
  30. return func(l *SLogger) {
  31. l.sinks = sinks
  32. }
  33. }
  34. func SLoggerWithConsole(console bool) SLoggerOption {
  35. return func(l *SLogger) {
  36. l.console = console
  37. }
  38. }
  39. func SLoggerWithCompress(compress bool) SLoggerOption {
  40. return func(l *SLogger) {
  41. l.settings.Compress = compress
  42. }
  43. }
  44. func SLoggerWithMaxSizeSingleFile(maxsize int) SLoggerOption {
  45. return func(l *SLogger) {
  46. if maxsize < 1 {
  47. maxsize = defMaxSize
  48. }
  49. l.settings.MaxSize = maxsize
  50. }
  51. }
  52. func SLoggerWithMaxAge(maxage int) SLoggerOption {
  53. return func(l *SLogger) {
  54. if maxage < 1 {
  55. maxage = defMaxAge
  56. }
  57. l.settings.MaxAge = maxage
  58. }
  59. }
  60. func SLoggerWithMaxBackups(maxbackups int) SLoggerOption {
  61. return func(l *SLogger) {
  62. if maxbackups < 1 {
  63. maxbackups = defMaxBackups
  64. }
  65. l.settings.MaxBackups = maxbackups
  66. }
  67. }
  68. /// means log in a single file
  69. /// 默认配置:
  70. /// json 格式
  71. /// 单文件最大 10 m
  72. /// 最多保留1个月
  73. /// 压缩备份
  74. type SLogger struct {
  75. f string
  76. lg *zap.Logger
  77. settings lumberjack.Logger
  78. console bool
  79. sinks []zap.Sink
  80. }
  81. // @console: 是否输出到 console
  82. // @path: 路径
  83. // @level: 日志等级
  84. // @sinks: 日志额外的输出
  85. func NewSLogger(path string, level string, options ...SLoggerOption) *SLogger {
  86. slogger := &SLogger{
  87. f: path,
  88. lg: nil,
  89. settings: lumberjack.Logger{
  90. Filename: path,
  91. MaxSize: defMaxSize, //M
  92. MaxAge: defMaxAge, //d
  93. MaxBackups: defMaxBackups, //numbers
  94. Compress: defCompressing,
  95. },
  96. console: true,
  97. }
  98. for _, opt := range options {
  99. opt(slogger)
  100. }
  101. encoderConf := zapcore.EncoderConfig{
  102. MessageKey: "msg",
  103. LevelKey: "level",
  104. TimeKey: "ts",
  105. NameKey: "logger",
  106. CallerKey: "caller",
  107. StacktraceKey: "trace",
  108. LineEnding: zapcore.DefaultLineEnding,
  109. EncodeLevel: zapcore.LowercaseLevelEncoder,
  110. EncodeTime: zapcore.ISO8601TimeEncoder,
  111. EncodeDuration: zapcore.SecondsDurationEncoder,
  112. EncodeCaller: zapcore.ShortCallerEncoder,
  113. }
  114. // level
  115. corelevel, ok := levelMap[level]
  116. if !ok {
  117. fmt.Println("Warning: invalid log level: ", level)
  118. corelevel = defLevel
  119. }
  120. atom := zap.NewAtomicLevelAt(corelevel)
  121. wss := []zapcore.WriteSyncer{zapcore.AddSync(&slogger.settings)}
  122. if slogger.console {
  123. wss = append(wss, zapcore.AddSync(os.Stdout))
  124. }
  125. for _, sink := range slogger.sinks {
  126. wss = append(wss, zapcore.AddSync(sink))
  127. }
  128. // writeSyncer
  129. ws := zapcore.NewMultiWriteSyncer(wss...)
  130. // core
  131. core := zapcore.NewCore(zapcore.NewJSONEncoder(encoderConf), ws, atom)
  132. caller := zap.AddCaller()
  133. callerSkip := zap.AddCallerSkip(2)
  134. dev := zap.Development()
  135. stack := zap.AddStacktrace(zapcore.ErrorLevel)
  136. slogger.lg = zap.New(core, caller, callerSkip, dev, stack)
  137. return slogger
  138. }
  139. func (self *SLogger) Debug(msg string, fields ...zap.Field) {
  140. self.lg.Debug(msg, fields...)
  141. }
  142. func (self *SLogger) Info(msg string, fields ...zap.Field) {
  143. self.lg.Info(msg, fields...)
  144. }
  145. func (self *SLogger) Warn(msg string, fields ...zap.Field) {
  146. self.lg.Warn(msg, fields...)
  147. }
  148. func (self *SLogger) Error(msg string, fields ...zap.Field) {
  149. self.lg.Error(msg, fields...)
  150. }
  151. func (self *SLogger) Panic(msg string, fields ...zap.Field) {
  152. self.lg.Panic(msg, fields...)
  153. }
  154. func (self *SLogger) Fatal(msg string, fields ...zap.Field) {
  155. self.lg.Fatal(msg, fields...)
  156. }
  157. func (self *SLogger) Sync() {
  158. _ = self.lg.Sync()
  159. }
  160. func SetDefaultLogger(logger *SLogger, others ...*SLogger) {
  161. defaultLog = logger
  162. if len(others) > 0 {
  163. defaultErr = others[0]
  164. } else {
  165. defaultErr = defaultLog
  166. }
  167. if len(others) > 1 {
  168. defaultWarn = others[1]
  169. } else {
  170. defaultWarn = defaultLog
  171. }
  172. }
  173. func Debug(msg string, fields ...zap.Field) {
  174. defaultLog.Debug(msg, fields...)
  175. }
  176. func Info(msg string, fields ...zap.Field) {
  177. defaultLog.Info(msg, fields...)
  178. }
  179. func Warn(msg string, fields ...zap.Field) {
  180. defaultWarn.Warn(msg, fields...)
  181. }
  182. func Error(msg string, fields ...zap.Field) {
  183. defaultErr.Error(msg, fields...)
  184. }
  185. func Panic(msg string, fields ...zap.Field) {
  186. defaultLog.Panic(msg, fields...)
  187. }
  188. func Fatal(msg string, fields ...zap.Field) {
  189. defaultLog.Fatal(msg, fields...)
  190. }
  191. func Sync() {
  192. defaultLog.Sync()
  193. }