log.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * @Author: LinkLeong link@icewhale.com
  3. * @Date: 2022-06-02 15:09:38
  4. * @LastEditors: LinkLeong
  5. * @LastEditTime: 2022-06-27 15:47:49
  6. * @FilePath: /CasaOS/pkg/utils/loger/log.go
  7. * @Description:
  8. * @Website: https://www.casaos.io
  9. * Copyright (c) 2022 by icewhale, All Rights Reserved.
  10. */
  11. package loger
  12. import (
  13. "fmt"
  14. "os"
  15. "path"
  16. "path/filepath"
  17. "runtime"
  18. "github.com/IceWhaleTech/CasaOS/pkg/config"
  19. "go.uber.org/zap"
  20. "go.uber.org/zap/zapcore"
  21. "gopkg.in/natefinch/lumberjack.v2"
  22. )
  23. var loggers *zap.Logger
  24. func getFileLogWriter() (writeSyncer zapcore.WriteSyncer) {
  25. // 使用 lumberjack 实现 log rotate
  26. lumberJackLogger := &lumberjack.Logger{
  27. Filename: filepath.Join(config.AppInfo.LogPath, fmt.Sprintf("%s.%s",
  28. config.AppInfo.LogSaveName,
  29. config.AppInfo.LogFileExt,
  30. )),
  31. MaxSize: 10,
  32. MaxBackups: 60,
  33. MaxAge: 1,
  34. Compress: true,
  35. }
  36. return zapcore.AddSync(lumberJackLogger)
  37. }
  38. func LogInit() {
  39. encoderConfig := zap.NewProductionEncoderConfig()
  40. encoderConfig.EncodeTime = zapcore.EpochTimeEncoder
  41. encoder := zapcore.NewJSONEncoder(encoderConfig)
  42. fileWriteSyncer := getFileLogWriter()
  43. core := zapcore.NewTee(
  44. zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.InfoLevel),
  45. zapcore.NewCore(encoder, fileWriteSyncer, zapcore.InfoLevel),
  46. )
  47. loggers = zap.New(core)
  48. }
  49. func Info(message string, fields ...zap.Field) {
  50. callerFields := getCallerInfoForLog()
  51. fields = append(fields, callerFields...)
  52. loggers.Info(message, fields...)
  53. }
  54. func Debug(message string, fields ...zap.Field) {
  55. callerFields := getCallerInfoForLog()
  56. fields = append(fields, callerFields...)
  57. loggers.Debug(message, fields...)
  58. }
  59. func Error(message string, fields ...zap.Field) {
  60. callerFields := getCallerInfoForLog()
  61. fields = append(fields, callerFields...)
  62. loggers.Error(message, fields...)
  63. }
  64. func Warn(message string, fields ...zap.Field) {
  65. callerFields := getCallerInfoForLog()
  66. fields = append(fields, callerFields...)
  67. loggers.Warn(message, fields...)
  68. }
  69. func getCallerInfoForLog() (callerFields []zap.Field) {
  70. pc, file, line, ok := runtime.Caller(2) // 回溯两层,拿到写日志的调用方的函数信息
  71. if !ok {
  72. return
  73. }
  74. funcName := runtime.FuncForPC(pc).Name()
  75. funcName = path.Base(funcName) //Base函数返回路径的最后一个元素,只保留函数名
  76. callerFields = append(callerFields, zap.String("func", funcName), zap.String("file", file), zap.Int("line", line))
  77. return
  78. }