log.go 2.5 KB

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