zlog.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package zlog
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "os"
  7. "sync"
  8. "github.com/rotisserie/eris"
  9. "github.com/spf13/viper"
  10. "go.uber.org/zap"
  11. "go.uber.org/zap/zapcore"
  12. "sikey.com/websocket/utils/keys"
  13. )
  14. var (
  15. l *Logger
  16. once = sync.Once{}
  17. )
  18. type Logger struct {
  19. log *zap.Logger
  20. ctx context.Context
  21. }
  22. func NewZapLogger() *Logger {
  23. var name = viper.GetString("name")
  24. var env = viper.GetString("environment")
  25. var path = viper.GetString("logPath")
  26. var err error
  27. var writer Writer
  28. writer, err = NewZeroWriter(name, path, env)
  29. if err != nil {
  30. log.Fatalln(err)
  31. }
  32. return NewLogger(writer)
  33. }
  34. func NewSLSLogger(cfg SLSWriterConfig) *Logger {
  35. var writer Writer
  36. writer = NewSLSWriter(cfg)
  37. return NewLogger(writer)
  38. }
  39. func NewLogger(writer Writer) *Logger {
  40. // 限制日志输出级别, >= DebugLevel 会打印所有级别的日志
  41. // 生产环境中一般使用 >= ErrorLevel
  42. lowPriority := zap.LevelEnablerFunc(func(lv zapcore.Level) bool {
  43. return lv >= zapcore.DebugLevel
  44. })
  45. // 控制台展示方便调试,使用 TEXT 的方式
  46. consoleEncoderConfig := zap.NewDevelopmentEncoderConfig()
  47. consoleEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
  48. consoleEncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
  49. consoleEncoder := zapcore.NewConsoleEncoder(consoleEncoderConfig)
  50. stdCore := zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), lowPriority)
  51. // 日志格式化
  52. productionEncoderConfig := zap.NewProductionEncoderConfig()
  53. productionEncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
  54. jsonEnc := zapcore.NewJSONEncoder(productionEncoderConfig)
  55. // 使用 JSON 格式日志
  56. var core zapcore.Core
  57. if writer.GetEnv() != notPushEnvironment {
  58. syncer := zapcore.AddSync(writer)
  59. esCore := zapcore.NewCore(jsonEnc, syncer, lowPriority).With([]zap.Field{zap.String("env", writer.GetEnv())})
  60. core = zapcore.NewTee(stdCore, esCore)
  61. } else {
  62. core = stdCore
  63. }
  64. // logger 输出到 console 且标识调用代码行
  65. l := zap.New(core).WithOptions(zap.AddCallerSkip(1), zap.AddCaller())
  66. return &Logger{log: l}
  67. }
  68. func NewLoggerWithZapCode(l *zap.Logger) *Logger {
  69. return &Logger{log: l}
  70. }
  71. func WithContext(ctx context.Context) *Logger {
  72. requestId := ctx.Value(keys.HeaderRequestId)
  73. l := NewLoggerWithZapCode(l.log)
  74. if requestId != nil {
  75. if id, ok := requestId.(string); ok {
  76. l.log = l.log.With(zap.String(keys.HeaderRequestId, id))
  77. }
  78. }
  79. return l
  80. }
  81. func WithZapLogger(log *Logger) {
  82. once.Do(func() {
  83. l = log
  84. })
  85. }
  86. func (l *Logger) WithField(key, value string) *Logger {
  87. return NewLoggerWithZapCode(
  88. l.log.With(zap.String(key, value)),
  89. )
  90. }
  91. // Debug logs a message at info level.
  92. func (l *Logger) Debug(args ...any) {
  93. l.log.Debug(fmt.Sprint(args...))
  94. }
  95. // Debugf logs a message at info level.
  96. func (l *Logger) Debugf(msg string, args ...any) {
  97. l.log.Debug(fmt.Sprintf(msg, args...))
  98. }
  99. // Debugv logs a message at info level.
  100. func (l *Logger) Debugv(arg any) {
  101. l.log.Debug(fmt.Sprint(arg))
  102. }
  103. // Debugw logs a message at info level.
  104. func (l *Logger) Debugw(msg string, fields ...zap.Field) {
  105. l.log.Debug(fmt.Sprintf(msg, toValues(fields)...))
  106. }
  107. // Error logs a message at error level.
  108. func (l *Logger) Error(args ...any) {
  109. l.log.Error(fmt.Sprint(args...))
  110. }
  111. func (l *Logger) ErrorStack(err error) {
  112. format := eris.NewDefaultStringFormat(eris.FormatOptions{
  113. InvertOutput: true,
  114. WithTrace: true,
  115. InvertTrace: true,
  116. })
  117. formattedStr := eris.ToCustomString(err, format)
  118. l.log.Error(formattedStr)
  119. }
  120. // Errorf logs a message at error level.
  121. func (l *Logger) Errorf(msg string, args ...any) {
  122. l.log.Error(fmt.Sprintf(msg, args...))
  123. }
  124. // Errorv logs a message at error level.
  125. func (l *Logger) Errorv(arg any) {
  126. l.log.Error(fmt.Sprint(arg))
  127. }
  128. // Errorw logs a message at error level.
  129. func (l *Logger) Errorw(msg string, fields ...zap.Field) {
  130. l.log.Error(fmt.Sprintf(msg, toValues(fields)...))
  131. }
  132. // Info logs a message at info level.
  133. func (l *Logger) Info(args ...any) {
  134. l.log.Info(fmt.Sprint(args...))
  135. }
  136. // Infof logs a message at info level.
  137. func (l *Logger) Infof(msg string, args ...any) {
  138. l.log.Info(fmt.Sprintf(msg, args...))
  139. }
  140. // Infov logs a message at info level.
  141. func (l *Logger) Infov(arg any) {
  142. l.log.Info(fmt.Sprint(arg))
  143. }
  144. // Infow logs a message at info level.
  145. func (l *Logger) Infow(msg string, fields ...zap.Field) {
  146. l.log.Info(fmt.Sprintf(msg, toValues(fields)...))
  147. }
  148. // Debug logs a message at info level.
  149. func Debug(args ...any) {
  150. l.log.Debug(fmt.Sprint(args...))
  151. }
  152. // Debugf logs a message at info level.
  153. func Debugf(msg string, args ...any) {
  154. l.log.Debug(fmt.Sprintf(msg, args...))
  155. }
  156. // Debugv logs a message at info level.
  157. func Debugv(arg any) {
  158. l.log.Debug(fmt.Sprint(arg))
  159. }
  160. // Debugw logs a message at info level.
  161. func Debugw(msg string, fields ...zap.Field) {
  162. l.log.Debug(fmt.Sprintf(msg, toValues(fields)...))
  163. }
  164. // Error logs a message at error level.
  165. func Error(args ...any) {
  166. l.log.Error(fmt.Sprint(args...))
  167. }
  168. func ErrorStack(err error) {
  169. format := eris.NewDefaultStringFormat(eris.FormatOptions{
  170. InvertOutput: true,
  171. WithTrace: true,
  172. InvertTrace: true,
  173. })
  174. formattedStr := eris.ToCustomString(err, format)
  175. l.log.Error(formattedStr)
  176. }
  177. // Errorf logs a message at error level.
  178. func Errorf(msg string, args ...any) {
  179. l.log.Error(fmt.Sprintf(msg, args...))
  180. }
  181. // Errorv logs a message at error level.
  182. func Errorv(arg any) {
  183. l.log.Error(fmt.Sprint(arg))
  184. }
  185. // Errorw logs a message at error level.
  186. func Errorw(msg string, fields ...zap.Field) {
  187. l.log.Error(fmt.Sprintf(msg, toValues(fields)...))
  188. }
  189. // Info logs a message at info level.
  190. func Info(args ...any) {
  191. l.log.Info(fmt.Sprint(args...))
  192. }
  193. // Infof logs a message at info level.
  194. func Infof(msg string, args ...any) {
  195. l.log.Info(fmt.Sprintf(msg, args...))
  196. }
  197. // Infov logs a message at info level.
  198. func Infov(arg any) {
  199. l.log.Info(fmt.Sprint(arg))
  200. }
  201. // Infow logs a message at info level.
  202. func Infow(msg string, fields ...zap.Field) {
  203. l.log.Info(fmt.Sprintf(msg, toValues(fields)...))
  204. }
  205. func addLineBreakSymbol(msg string) string {
  206. return fmt.Sprintln(msg)
  207. }
  208. func toValues(fields []zap.Field) []any {
  209. var str []any = make([]any, len(fields))
  210. for i, field := range fields {
  211. str[i] = field.String
  212. }
  213. return str
  214. }