log.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package log
  2. import (
  3. "fmt"
  4. "github.com/v2ray/v2ray-core/common/serial"
  5. )
  6. const (
  7. DebugLevel = LogLevel(0)
  8. InfoLevel = LogLevel(1)
  9. WarningLevel = LogLevel(2)
  10. ErrorLevel = LogLevel(3)
  11. )
  12. type errorLog struct {
  13. prefix string
  14. values []interface{}
  15. }
  16. func (this *errorLog) String() string {
  17. data := ""
  18. for _, value := range this.values {
  19. switch typedVal := value.(type) {
  20. case string:
  21. data += typedVal
  22. case *string:
  23. data += *typedVal
  24. case serial.String:
  25. data += typedVal.String()
  26. case error:
  27. data += typedVal.Error()
  28. default:
  29. data += fmt.Sprintf("%v", value)
  30. }
  31. }
  32. return this.prefix + data
  33. }
  34. var (
  35. noOpLoggerInstance logWriter = &noOpLogWriter{}
  36. streamLoggerInstance logWriter = newStdOutLogWriter()
  37. debugLogger = noOpLoggerInstance
  38. infoLogger = noOpLoggerInstance
  39. warningLogger = streamLoggerInstance
  40. errorLogger = streamLoggerInstance
  41. )
  42. type LogLevel int
  43. func SetLogLevel(level LogLevel) {
  44. debugLogger = noOpLoggerInstance
  45. if level <= DebugLevel {
  46. debugLogger = streamLoggerInstance
  47. }
  48. infoLogger = noOpLoggerInstance
  49. if level <= InfoLevel {
  50. infoLogger = streamLoggerInstance
  51. }
  52. warningLogger = noOpLoggerInstance
  53. if level <= WarningLevel {
  54. warningLogger = streamLoggerInstance
  55. }
  56. errorLogger = noOpLoggerInstance
  57. if level <= ErrorLevel {
  58. errorLogger = streamLoggerInstance
  59. }
  60. }
  61. func InitErrorLogger(file string) error {
  62. logger, err := newFileLogWriter(file)
  63. if err != nil {
  64. Error("Failed to create error logger on file (", file, "): ", err)
  65. return err
  66. }
  67. streamLoggerInstance = logger
  68. return nil
  69. }
  70. // Debug outputs a debug log with given format and optional arguments.
  71. func Debug(v ...interface{}) {
  72. debugLogger.Log(&errorLog{
  73. prefix: "[Debug]",
  74. values: v,
  75. })
  76. }
  77. // Info outputs an info log with given format and optional arguments.
  78. func Info(v ...interface{}) {
  79. infoLogger.Log(&errorLog{
  80. prefix: "[Info]",
  81. values: v,
  82. })
  83. }
  84. // Warning outputs a warning log with given format and optional arguments.
  85. func Warning(v ...interface{}) {
  86. warningLogger.Log(&errorLog{
  87. prefix: "[Warning]",
  88. values: v,
  89. })
  90. }
  91. // Error outputs an error log with given format and optional arguments.
  92. func Error(v ...interface{}) {
  93. errorLogger.Log(&errorLog{
  94. prefix: "[Error]",
  95. values: v,
  96. })
  97. }