log.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package log
  2. //go:generate go run $GOPATH/src/v2ray.com/core/common/errors/errorgen/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. "v2ray.com/core/common/log"
  10. )
  11. var (
  12. streamLoggerInstance internal.LogWriter = internal.NewStdOutLogWriter()
  13. debugLogger internal.LogWriter = streamLoggerInstance
  14. infoLogger internal.LogWriter = streamLoggerInstance
  15. warningLogger internal.LogWriter = streamLoggerInstance
  16. errorLogger internal.LogWriter = streamLoggerInstance
  17. )
  18. func SetLogLevel(level LogLevel) {
  19. debugLogger = new(internal.NoOpLogWriter)
  20. if level >= LogLevel_Debug {
  21. debugLogger = streamLoggerInstance
  22. }
  23. infoLogger = new(internal.NoOpLogWriter)
  24. if level >= LogLevel_Info {
  25. infoLogger = streamLoggerInstance
  26. }
  27. warningLogger = new(internal.NoOpLogWriter)
  28. if level >= LogLevel_Warning {
  29. warningLogger = streamLoggerInstance
  30. }
  31. errorLogger = new(internal.NoOpLogWriter)
  32. if level >= LogLevel_Error {
  33. errorLogger = streamLoggerInstance
  34. }
  35. }
  36. func InitErrorLogger(file string) error {
  37. logger, err := internal.NewFileLogWriter(file)
  38. if err != nil {
  39. return newError("failed to create error logger on file (", file, ")").Base(err)
  40. }
  41. streamLoggerInstance = logger
  42. return nil
  43. }
  44. func getLoggerAndPrefix(s log.Severity) (internal.LogWriter, string) {
  45. switch s {
  46. case log.Severity_Debug:
  47. return debugLogger, "[Debug]"
  48. case log.Severity_Info:
  49. return infoLogger, "[Info]"
  50. case log.Severity_Warning:
  51. return warningLogger, "[Warning]"
  52. case log.Severity_Error:
  53. return errorLogger, "[Error]"
  54. default:
  55. return infoLogger, "[Info]"
  56. }
  57. }
  58. // Trace logs an error message based on its severity.
  59. func Trace(err error) {
  60. if err == nil {
  61. return
  62. }
  63. logger, prefix := getLoggerAndPrefix(errors.GetSeverity(err))
  64. logger.Log(&internal.ErrorLog{
  65. Prefix: prefix,
  66. Error: err,
  67. })
  68. }
  69. type Instance struct {
  70. config *Config
  71. }
  72. func New(ctx context.Context, config *Config) (*Instance, error) {
  73. return &Instance{config: config}, nil
  74. }
  75. func (*Instance) Interface() interface{} {
  76. return (*Instance)(nil)
  77. }
  78. func (g *Instance) Start() error {
  79. config := g.config
  80. if config.AccessLogType == LogType_File {
  81. if err := InitAccessLogger(config.AccessLogPath); err != nil {
  82. return err
  83. }
  84. }
  85. if config.ErrorLogType == LogType_None {
  86. SetLogLevel(LogLevel_Disabled)
  87. } else {
  88. if config.ErrorLogType == LogType_File {
  89. if err := InitErrorLogger(config.ErrorLogPath); err != nil {
  90. return err
  91. }
  92. }
  93. SetLogLevel(config.ErrorLogLevel)
  94. }
  95. return nil
  96. }
  97. func (*Instance) Close() {
  98. streamLoggerInstance.Close()
  99. accessLoggerInstance.Close()
  100. }
  101. func FromSpace(space app.Space) *Instance {
  102. v := space.GetApplication((*Instance)(nil))
  103. if logger, ok := v.(*Instance); ok && logger != nil {
  104. return logger
  105. }
  106. return nil
  107. }
  108. func init() {
  109. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  110. return New(ctx, config.(*Config))
  111. }))
  112. }