log.go 2.5 KB

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