logger.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Package logger provides logging capabilities.
  2. // It is a wrapper around zerolog for logging and lumberjack for log rotation.
  3. // Logs are written to the specified log file.
  4. // Logging on the console is provided to print initialization info, errors and warnings.
  5. // The package provides a request logger to log the HTTP requests for REST API too.
  6. // The request logger uses chi.middleware.RequestLogger,
  7. // chi.middleware.LogFormatter and chi.middleware.LogEntry to build a structured
  8. // logger using zerlog
  9. package logger
  10. import (
  11. "fmt"
  12. "os"
  13. "runtime"
  14. "github.com/rs/zerolog"
  15. lumberjack "gopkg.in/natefinch/lumberjack.v2"
  16. )
  17. const (
  18. dateFormat = "2006-01-02T15:04.05.000" // YYYY-MM-DDTHH:MM.SS.ZZZ
  19. )
  20. var (
  21. logger zerolog.Logger
  22. consoleLogger zerolog.Logger
  23. )
  24. // GetLogger get the configured logger instance
  25. func GetLogger() *zerolog.Logger {
  26. return &logger
  27. }
  28. // InitLogger configures the logger using the given parameters
  29. func InitLogger(logFilePath string, logMaxSize int, logMaxBackups int, logMaxAge int, logCompress bool, level zerolog.Level) {
  30. zerolog.TimeFieldFormat = dateFormat
  31. logger = zerolog.New(&lumberjack.Logger{
  32. Filename: logFilePath,
  33. MaxSize: logMaxSize,
  34. MaxBackups: logMaxBackups,
  35. MaxAge: logMaxAge,
  36. Compress: logCompress,
  37. }).With().Timestamp().Logger().Level(level)
  38. consoleOutput := zerolog.ConsoleWriter{
  39. Out: os.Stdout,
  40. TimeFormat: dateFormat,
  41. NoColor: runtime.GOOS == "windows",
  42. }
  43. consoleLogger = zerolog.New(consoleOutput).With().Timestamp().Logger().Level(level)
  44. }
  45. // Debug logs at debug level for the specified sender
  46. func Debug(sender string, format string, v ...interface{}) {
  47. logger.Debug().Str("sender", sender).Msg(fmt.Sprintf(format, v...))
  48. }
  49. // Info logs at info level for the specified sender
  50. func Info(sender string, format string, v ...interface{}) {
  51. logger.Info().Str("sender", sender).Msg(fmt.Sprintf(format, v...))
  52. }
  53. // Warn logs at warn level for the specified sender
  54. func Warn(sender string, format string, v ...interface{}) {
  55. logger.Warn().Str("sender", sender).Msg(fmt.Sprintf(format, v...))
  56. }
  57. // Error logs at error level for the specified sender
  58. func Error(sender string, format string, v ...interface{}) {
  59. logger.Error().Str("sender", sender).Msg(fmt.Sprintf(format, v...))
  60. }
  61. // DebugToConsole logs at debug level to stdout
  62. func DebugToConsole(format string, v ...interface{}) {
  63. consoleLogger.Debug().Msg(fmt.Sprintf(format, v...))
  64. }
  65. // InfoToConsole logs at info level to stdout
  66. func InfoToConsole(format string, v ...interface{}) {
  67. consoleLogger.Info().Msg(fmt.Sprintf(format, v...))
  68. }
  69. // WarnToConsole logs at info level to stdout
  70. func WarnToConsole(format string, v ...interface{}) {
  71. consoleLogger.Warn().Msg(fmt.Sprintf(format, v...))
  72. }
  73. // ErrorToConsole logs at error level to stdout
  74. func ErrorToConsole(format string, v ...interface{}) {
  75. consoleLogger.Error().Msg(fmt.Sprintf(format, v...))
  76. }
  77. // TransferLog logs an SFTP/SCP upload or download
  78. func TransferLog(operation string, path string, elapsed int64, size int64, user string, connectionID string, protocol string) {
  79. logger.Info().
  80. Str("sender", operation).
  81. Int64("elapsed_ms", elapsed).
  82. Int64("size_bytes", size).
  83. Str("username", user).
  84. Str("file_path", path).
  85. Str("connection_id", connectionID).
  86. Str("protocol", protocol).
  87. Msg("")
  88. }
  89. // CommandLog logs an SFTP/SCP command
  90. func CommandLog(command string, path string, target string, user string, connectionID string, protocol string) {
  91. logger.Info().
  92. Str("sender", command).
  93. Str("username", user).
  94. Str("file_path", path).
  95. Str("target_path", target).
  96. Str("connection_id", connectionID).
  97. Str("protocol", protocol).
  98. Msg("")
  99. }