log.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. "sync"
  6. "v2ray.com/core/app"
  7. "v2ray.com/core/app/log/internal"
  8. "v2ray.com/core/common"
  9. "v2ray.com/core/common/log"
  10. )
  11. type Instance struct {
  12. sync.RWMutex
  13. config *Config
  14. accessLogger internal.LogWriter
  15. errorLogger internal.LogWriter
  16. }
  17. func New(ctx context.Context, config *Config) (*Instance, error) {
  18. return &Instance{
  19. config: config,
  20. }, nil
  21. }
  22. func (*Instance) Interface() interface{} {
  23. return (*Instance)(nil)
  24. }
  25. func (g *Instance) initAccessLogger() error {
  26. switch g.config.AccessLogType {
  27. case LogType_File:
  28. logger, err := internal.NewFileLogWriter(g.config.AccessLogPath)
  29. if err != nil {
  30. return err
  31. }
  32. g.accessLogger = logger
  33. case LogType_Console:
  34. g.accessLogger = internal.NewStdOutLogWriter()
  35. default:
  36. }
  37. return nil
  38. }
  39. func (g *Instance) initErrorLogger() error {
  40. switch g.config.ErrorLogType {
  41. case LogType_File:
  42. logger, err := internal.NewFileLogWriter(g.config.ErrorLogPath)
  43. if err != nil {
  44. return err
  45. }
  46. g.errorLogger = logger
  47. case LogType_Console:
  48. g.errorLogger = internal.NewStdOutLogWriter()
  49. default:
  50. }
  51. return nil
  52. }
  53. func (g *Instance) Start() error {
  54. if err := g.initAccessLogger(); err != nil {
  55. return newError("failed to initialize access logger").Base(err).AtWarning()
  56. }
  57. if err := g.initErrorLogger(); err != nil {
  58. return newError("failed to initialize error logger").Base(err).AtWarning()
  59. }
  60. log.RegisterHandler(g)
  61. return nil
  62. }
  63. func (g *Instance) Handle(msg log.Message) {
  64. switch msg := msg.(type) {
  65. case *log.AccessMessage:
  66. g.RLock()
  67. defer g.RUnlock()
  68. if g.accessLogger != nil {
  69. g.accessLogger.Log(msg)
  70. }
  71. case *log.GeneralMessage:
  72. if msg.Severity.SevererThan(g.config.ErrorLogLevel) {
  73. g.RLock()
  74. defer g.RUnlock()
  75. if g.errorLogger != nil {
  76. g.errorLogger.Log(msg)
  77. }
  78. }
  79. default:
  80. // Swallow
  81. }
  82. }
  83. func (g *Instance) Close() {
  84. g.Lock()
  85. defer g.Unlock()
  86. g.accessLogger.Close()
  87. g.accessLogger = nil
  88. g.errorLogger.Close()
  89. g.errorLogger = nil
  90. }
  91. func FromSpace(space app.Space) *Instance {
  92. v := space.GetApplication((*Instance)(nil))
  93. if logger, ok := v.(*Instance); ok && logger != nil {
  94. return logger
  95. }
  96. return nil
  97. }
  98. func init() {
  99. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  100. return New(ctx, config.(*Config))
  101. }))
  102. }