log.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package utils
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strings"
  7. "time"
  8. )
  9. // LogLevel of quic-go
  10. type LogLevel uint8
  11. const (
  12. // LogLevelNothing disables
  13. LogLevelNothing LogLevel = iota
  14. // LogLevelError enables err logs
  15. LogLevelError
  16. // LogLevelInfo enables info logs (e.g. packets)
  17. LogLevelInfo
  18. // LogLevelDebug enables debug logs (e.g. packet contents)
  19. LogLevelDebug
  20. )
  21. const logEnv = "QUIC_GO_LOG_LEVEL"
  22. // A Logger logs.
  23. type Logger interface {
  24. SetLogLevel(LogLevel)
  25. SetLogTimeFormat(format string)
  26. WithPrefix(prefix string) Logger
  27. Debug() bool
  28. Errorf(format string, args ...interface{})
  29. Infof(format string, args ...interface{})
  30. Debugf(format string, args ...interface{})
  31. }
  32. // DefaultLogger is used by quic-go for logging.
  33. var DefaultLogger Logger
  34. type defaultLogger struct {
  35. prefix string
  36. logLevel LogLevel
  37. timeFormat string
  38. }
  39. var _ Logger = &defaultLogger{}
  40. // SetLogLevel sets the log level
  41. func (l *defaultLogger) SetLogLevel(level LogLevel) {
  42. l.logLevel = level
  43. }
  44. // SetLogTimeFormat sets the format of the timestamp
  45. // an empty string disables the logging of timestamps
  46. func (l *defaultLogger) SetLogTimeFormat(format string) {
  47. log.SetFlags(0) // disable timestamp logging done by the log package
  48. l.timeFormat = format
  49. }
  50. // Debugf logs something
  51. func (l *defaultLogger) Debugf(format string, args ...interface{}) {
  52. if l.logLevel == LogLevelDebug {
  53. l.logMessage(format, args...)
  54. }
  55. }
  56. // Infof logs something
  57. func (l *defaultLogger) Infof(format string, args ...interface{}) {
  58. if l.logLevel >= LogLevelInfo {
  59. l.logMessage(format, args...)
  60. }
  61. }
  62. // Errorf logs something
  63. func (l *defaultLogger) Errorf(format string, args ...interface{}) {
  64. if l.logLevel >= LogLevelError {
  65. l.logMessage(format, args...)
  66. }
  67. }
  68. func (l *defaultLogger) logMessage(format string, args ...interface{}) {
  69. var pre string
  70. if len(l.timeFormat) > 0 {
  71. pre = time.Now().Format(l.timeFormat) + " "
  72. }
  73. if len(l.prefix) > 0 {
  74. pre += l.prefix + " "
  75. }
  76. log.Printf(pre+format, args...)
  77. }
  78. func (l *defaultLogger) WithPrefix(prefix string) Logger {
  79. if len(l.prefix) > 0 {
  80. prefix = l.prefix + " " + prefix
  81. }
  82. return &defaultLogger{
  83. logLevel: l.logLevel,
  84. timeFormat: l.timeFormat,
  85. prefix: prefix,
  86. }
  87. }
  88. // Debug returns true if the log level is LogLevelDebug
  89. func (l *defaultLogger) Debug() bool {
  90. return l.logLevel == LogLevelDebug
  91. }
  92. func init() {
  93. DefaultLogger = &defaultLogger{}
  94. DefaultLogger.SetLogLevel(readLoggingEnv())
  95. }
  96. func readLoggingEnv() LogLevel {
  97. switch strings.ToLower(os.Getenv(logEnv)) {
  98. case "":
  99. return LogLevelNothing
  100. case "debug":
  101. return LogLevelDebug
  102. case "info":
  103. return LogLevelInfo
  104. case "error":
  105. return LogLevelError
  106. default:
  107. fmt.Fprintln(os.Stderr, "invalid quic-go log level, see https://github.com/lucas-clemente/quic-go/wiki/Logging")
  108. return LogLevelNothing
  109. }
  110. }