logger.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package logger // import "miniflux.app/logger"
  5. import (
  6. "fmt"
  7. "os"
  8. "time"
  9. )
  10. var requestedLevel = InfoLevel
  11. var displayDateTime = false
  12. // LogLevel type.
  13. type LogLevel uint32
  14. const (
  15. // FatalLevel should be used in fatal situations, the app will exit.
  16. FatalLevel LogLevel = iota
  17. // ErrorLevel should be used when someone should really look at the error.
  18. ErrorLevel
  19. // InfoLevel should be used during normal operations.
  20. InfoLevel
  21. // DebugLevel should be used only during development.
  22. DebugLevel
  23. )
  24. func (level LogLevel) String() string {
  25. switch level {
  26. case DebugLevel:
  27. return "DEBUG"
  28. case InfoLevel:
  29. return "INFO"
  30. case ErrorLevel:
  31. return "ERROR"
  32. case FatalLevel:
  33. return "FATAL"
  34. default:
  35. return "UNKNOWN"
  36. }
  37. }
  38. // EnableDateTime enables date time in log messages.
  39. func EnableDateTime() {
  40. displayDateTime = true
  41. }
  42. // EnableDebug increases logging, more verbose (debug)
  43. func EnableDebug() {
  44. requestedLevel = DebugLevel
  45. formatMessage(InfoLevel, "Debug mode enabled")
  46. }
  47. // Debug sends a debug log message.
  48. func Debug(format string, v ...interface{}) {
  49. if requestedLevel >= DebugLevel {
  50. formatMessage(DebugLevel, format, v...)
  51. }
  52. }
  53. // Info sends an info log message.
  54. func Info(format string, v ...interface{}) {
  55. if requestedLevel >= InfoLevel {
  56. formatMessage(InfoLevel, format, v...)
  57. }
  58. }
  59. // Error sends an error log message.
  60. func Error(format string, v ...interface{}) {
  61. if requestedLevel >= ErrorLevel {
  62. formatMessage(ErrorLevel, format, v...)
  63. }
  64. }
  65. // Fatal sends a fatal log message and stop the execution of the program.
  66. func Fatal(format string, v ...interface{}) {
  67. if requestedLevel >= FatalLevel {
  68. formatMessage(FatalLevel, format, v...)
  69. os.Exit(1)
  70. }
  71. }
  72. func formatMessage(level LogLevel, format string, v ...interface{}) {
  73. var prefix string
  74. if displayDateTime {
  75. prefix = fmt.Sprintf("[%s] [%s] ", time.Now().Format("2006-01-02T15:04:05"), level)
  76. } else {
  77. prefix = fmt.Sprintf("[%s] ", level)
  78. }
  79. fmt.Fprintf(os.Stderr, prefix+format+"\n", v...)
  80. }