log.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package log
  2. import "errors"
  3. // Logger is the universal logger that can do everything.
  4. type Logger interface {
  5. loggerStructured
  6. loggerFmt
  7. toStructured
  8. toFmt
  9. withName
  10. }
  11. type withName interface {
  12. WithName(name string) Logger
  13. }
  14. type toLogger interface {
  15. // Logger returns general logger
  16. Logger() Logger
  17. }
  18. // Structured provides interface for logging using fields.
  19. type Structured interface {
  20. loggerStructured
  21. toFmt
  22. toLogger
  23. }
  24. type loggerStructured interface {
  25. // Trace logs at Trace log level using fields
  26. Trace(msg string, fields ...Field)
  27. // Debug logs at Debug log level using fields
  28. Debug(msg string, fields ...Field)
  29. // Info logs at Info log level using fields
  30. Info(msg string, fields ...Field)
  31. // Warn logs at Warn log level using fields
  32. Warn(msg string, fields ...Field)
  33. // Error logs at Error log level using fields
  34. Error(msg string, fields ...Field)
  35. // Fatal logs at Fatal log level using fields
  36. Fatal(msg string, fields ...Field)
  37. }
  38. type toFmt interface {
  39. // Fmt returns fmt logger
  40. Fmt() Fmt
  41. }
  42. // Fmt provides interface for logging using fmt formatter.
  43. type Fmt interface {
  44. loggerFmt
  45. toStructured
  46. toLogger
  47. }
  48. type loggerFmt interface {
  49. // Tracef logs at Trace log level using fmt formatter
  50. Tracef(format string, args ...interface{})
  51. // Debugf logs at Debug log level using fmt formatter
  52. Debugf(format string, args ...interface{})
  53. // Infof logs at Info log level using fmt formatter
  54. Infof(format string, args ...interface{})
  55. // Warnf logs at Warn log level using fmt formatter
  56. Warnf(format string, args ...interface{})
  57. // Errorf logs at Error log level using fmt formatter
  58. Errorf(format string, args ...interface{})
  59. // Fatalf logs at Fatal log level using fmt formatter
  60. Fatalf(format string, args ...interface{})
  61. }
  62. type toStructured interface {
  63. // Structured returns structured logger
  64. Structured() Structured
  65. }
  66. // LoggerWith is an interface for 'With' function
  67. // LoggerWith provides interface for logger modifications.
  68. type LoggerWith interface {
  69. // With implements 'With'
  70. With(fields ...Field) Logger
  71. }
  72. // With for loggers that implement LoggerWith interface, returns logger that
  73. // always adds provided key/value to every log entry. Otherwise returns same logger.
  74. func With(l Logger, fields ...Field) Logger {
  75. e, ok := l.(LoggerWith)
  76. if !ok {
  77. return l
  78. }
  79. return e.With(fields...)
  80. }
  81. // LoggerAddCallerSkip is an interface for 'AddCallerSkip' function
  82. type LoggerAddCallerSkip interface {
  83. // AddCallerSkip implements 'AddCallerSkip'
  84. AddCallerSkip(skip int) Logger
  85. }
  86. // AddCallerSkip for loggers that implement LoggerAddCallerSkip interface, returns logger that
  87. // adds caller skip to each log entry. Otherwise returns same logger.
  88. func AddCallerSkip(l Logger, skip int) Logger {
  89. e, ok := l.(LoggerAddCallerSkip)
  90. if !ok {
  91. return l
  92. }
  93. return e.AddCallerSkip(skip)
  94. }
  95. // WriteAt is a helper method that checks logger and writes message at given level
  96. func WriteAt(l Structured, lvl Level, msg string, fields ...Field) error {
  97. if l == nil {
  98. return errors.New("nil logger given")
  99. }
  100. switch lvl {
  101. case DebugLevel:
  102. l.Debug(msg, fields...)
  103. case TraceLevel:
  104. l.Trace(msg, fields...)
  105. case InfoLevel:
  106. l.Info(msg, fields...)
  107. case WarnLevel:
  108. l.Warn(msg, fields...)
  109. case ErrorLevel:
  110. l.Error(msg, fields...)
  111. case FatalLevel:
  112. l.Fatal(msg, fields...)
  113. }
  114. return nil
  115. }