logger.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. This Source Code Form is subject to the terms of the Mozilla Public
  3. License, v. 2.0. If a copy of the MPL was not distributed with this
  4. file, You can obtain one at https://mozilla.org/MPL/2.0/.
  5. */
  6. package logger
  7. import (
  8. "io"
  9. "log"
  10. "os"
  11. "strings"
  12. )
  13. type LogLevel int
  14. const (
  15. LogLevelSilent LogLevel = iota
  16. LogLevelFatal
  17. LogLevelError
  18. LogLevelWarn
  19. LogLevelInfo
  20. LogLevelDebug
  21. )
  22. var logLevelPrefix = []string{
  23. "",
  24. "FATAL",
  25. "ERROR",
  26. "Warn",
  27. "Info",
  28. "debug",
  29. }
  30. const (
  31. LogLevelDefault = LogLevelWarn
  32. FlagsDefault = log.LstdFlags |
  33. log.LUTC |
  34. log.Lmsgprefix |
  35. log.Lmicroseconds
  36. )
  37. func NewLogger() *Logger {
  38. flags := FlagsDefault
  39. return &Logger{
  40. logger: log.New(os.Stderr, "", flags),
  41. debug: log.New(os.Stderr, "", flags|log.Lshortfile),
  42. level: LogLevelDefault,
  43. context: make([]string, 0, 8),
  44. }
  45. }
  46. type Logger struct {
  47. logger *log.Logger
  48. debug *log.Logger
  49. level LogLevel
  50. context []string
  51. }
  52. func (l *Logger) Level() LogLevel {
  53. return l.level
  54. }
  55. func (l *Logger) SetLevel(level LogLevel) {
  56. l.level = level
  57. }
  58. func (l *Logger) Writer() io.Writer {
  59. return l.logger.Writer()
  60. }
  61. func (l *Logger) SetOutput(w io.Writer) {
  62. l.logger.SetOutput(w)
  63. l.debug.SetOutput(w)
  64. }
  65. func (l *Logger) Flags() int {
  66. return l.logger.Flags()
  67. }
  68. func (l *Logger) SetFlags(flags int) {
  69. l.logger.SetFlags(flags)
  70. l.debug.SetFlags(flags)
  71. }
  72. func (l *Logger) Push(s string) *Logger {
  73. next := *l
  74. next.context = make([]string, 0, 8)
  75. copy(next.context, l.context)
  76. next.context = append(next.context, s)
  77. return &next
  78. }
  79. func (l *Logger) logAs(
  80. level LogLevel,
  81. format string,
  82. msg []any,
  83. ) {
  84. if level > l.level {
  85. return
  86. }
  87. prefix := logLevelPrefix[level]
  88. logr := l.logger
  89. if level == LogLevelDebug {
  90. logr = l.debug
  91. }
  92. context := strings.Join(l.context, ": ")
  93. if len(context) > 0 {
  94. context += ": "
  95. }
  96. logr.Printf("["+prefix+"] "+context+format, msg...)
  97. }
  98. func (l *Logger) Fatal(format string, msg ...any) {
  99. l.logAs(LogLevelFatal, format, msg)
  100. os.Exit(1)
  101. }
  102. func (l *Logger) Error(format string, msg ...any) {
  103. l.logAs(LogLevelError, format, msg)
  104. }
  105. func (l *Logger) Warn(format string, msg ...any) {
  106. l.logAs(LogLevelWarn, format, msg)
  107. }
  108. func (l *Logger) Info(format string, msg ...any) {
  109. l.logAs(LogLevelInfo, format, msg)
  110. }
  111. func (l *Logger) Debug(format string, msg ...any) {
  112. l.logAs(LogLevelDebug, format, msg)
  113. }