log.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package log
  2. //go:generate go run $GOPATH/src/v2ray.com/core/tools/generrorgen/main.go -pkg log -path App,Log
  3. import (
  4. "context"
  5. "v2ray.com/core/app"
  6. "v2ray.com/core/app/log/internal"
  7. "v2ray.com/core/common"
  8. "v2ray.com/core/common/errors"
  9. )
  10. var (
  11. streamLoggerInstance internal.LogWriter = internal.NewStdOutLogWriter()
  12. debugLogger internal.LogWriter = streamLoggerInstance
  13. infoLogger internal.LogWriter = streamLoggerInstance
  14. warningLogger internal.LogWriter = streamLoggerInstance
  15. errorLogger internal.LogWriter = streamLoggerInstance
  16. )
  17. func SetLogLevel(level LogLevel) {
  18. debugLogger = new(internal.NoOpLogWriter)
  19. if level >= LogLevel_Debug {
  20. debugLogger = streamLoggerInstance
  21. }
  22. infoLogger = new(internal.NoOpLogWriter)
  23. if level >= LogLevel_Info {
  24. infoLogger = streamLoggerInstance
  25. }
  26. warningLogger = new(internal.NoOpLogWriter)
  27. if level >= LogLevel_Warning {
  28. warningLogger = streamLoggerInstance
  29. }
  30. errorLogger = new(internal.NoOpLogWriter)
  31. if level >= LogLevel_Error {
  32. errorLogger = streamLoggerInstance
  33. }
  34. }
  35. func InitErrorLogger(file string) error {
  36. logger, err := internal.NewFileLogWriter(file)
  37. if err != nil {
  38. return newError("failed to create error logger on file (", file, ")").Base(err)
  39. }
  40. streamLoggerInstance = logger
  41. return nil
  42. }
  43. // writeDebug outputs a debug log with given format and optional arguments.
  44. func writeDebug(val ...interface{}) {
  45. debugLogger.Log(&internal.ErrorLog{
  46. Prefix: "[Debug]",
  47. Values: val,
  48. })
  49. }
  50. // writeInfo outputs an info log with given format and optional arguments.
  51. func writeInfo(val ...interface{}) {
  52. infoLogger.Log(&internal.ErrorLog{
  53. Prefix: "[Info]",
  54. Values: val,
  55. })
  56. }
  57. // writeWarning outputs a warning log with given format and optional arguments.
  58. func writeWarning(val ...interface{}) {
  59. warningLogger.Log(&internal.ErrorLog{
  60. Prefix: "[Warning]",
  61. Values: val,
  62. })
  63. }
  64. // writeError outputs an error log with given format and optional arguments.
  65. func writeError(val ...interface{}) {
  66. errorLogger.Log(&internal.ErrorLog{
  67. Prefix: "[Error]",
  68. Values: val,
  69. })
  70. }
  71. func Trace(err error) {
  72. s := errors.GetSeverity(err)
  73. switch s {
  74. case errors.SeverityDebug:
  75. writeDebug(err)
  76. case errors.SeverityInfo:
  77. writeInfo(err)
  78. case errors.SeverityWarning:
  79. writeWarning(err)
  80. case errors.SeverityError:
  81. writeError(err)
  82. default:
  83. writeInfo(err)
  84. }
  85. }
  86. type Instance struct {
  87. config *Config
  88. }
  89. func New(ctx context.Context, config *Config) (*Instance, error) {
  90. return &Instance{config: config}, nil
  91. }
  92. func (*Instance) Interface() interface{} {
  93. return (*Instance)(nil)
  94. }
  95. func (g *Instance) Start() error {
  96. config := g.config
  97. if config.AccessLogType == LogType_File {
  98. if err := InitAccessLogger(config.AccessLogPath); err != nil {
  99. return err
  100. }
  101. }
  102. if config.ErrorLogType == LogType_None {
  103. SetLogLevel(LogLevel_Disabled)
  104. } else {
  105. if config.ErrorLogType == LogType_File {
  106. if err := InitErrorLogger(config.ErrorLogPath); err != nil {
  107. return err
  108. }
  109. }
  110. SetLogLevel(config.ErrorLogLevel)
  111. }
  112. return nil
  113. }
  114. func (*Instance) Close() {
  115. streamLoggerInstance.Close()
  116. accessLoggerInstance.Close()
  117. }
  118. func FromSpace(space app.Space) *Instance {
  119. v := space.GetApplication((*Instance)(nil))
  120. if logger, ok := v.(*Instance); ok && logger != nil {
  121. return logger
  122. }
  123. return nil
  124. }
  125. func init() {
  126. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  127. return New(ctx, config.(*Config))
  128. }))
  129. }