log.go 2.6 KB

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