log.go 2.3 KB

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