log.go 2.2 KB

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