log.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. 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 FromSpace(space app.Space) *Instance {
  91. v := space.GetApplication((*Instance)(nil))
  92. if logger, ok := v.(*Instance); ok && logger != nil {
  93. return logger
  94. }
  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. }