log.go 3.0 KB

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