logrus.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package log
  2. import (
  3. "context"
  4. "os"
  5. "github.com/sagernet/sing-box/option"
  6. "github.com/sagernet/sing/common"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. F "github.com/sagernet/sing/common/format"
  9. "github.com/sirupsen/logrus"
  10. )
  11. var _ Logger = (*logrusLogger)(nil)
  12. type logrusLogger struct {
  13. abstractLogrusLogger
  14. output *os.File
  15. }
  16. type abstractLogrusLogger interface {
  17. logrus.Ext1FieldLogger
  18. WithContext(ctx context.Context) *logrus.Entry
  19. }
  20. func NewLogrusLogger(options option.LogOption) (*logrusLogger, error) {
  21. logger := logrus.New()
  22. logger.SetLevel(logrus.TraceLevel)
  23. logger.Formatter.(*logrus.TextFormatter).ForceColors = true
  24. logger.AddHook(new(logrusHook))
  25. var output *os.File
  26. var err error
  27. if options.Level != "" {
  28. logger.Level, err = logrus.ParseLevel(options.Level)
  29. if err != nil {
  30. return nil, err
  31. }
  32. }
  33. if options.Output != "" {
  34. output, err = os.OpenFile(options.Output, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
  35. if err != nil {
  36. return nil, E.Extend(err, "open log output")
  37. }
  38. logger.SetOutput(output)
  39. }
  40. return &logrusLogger{logger, output}, nil
  41. }
  42. func (l *logrusLogger) WithContext(ctx context.Context) Logger {
  43. return &logrusLogger{l.abstractLogrusLogger.WithContext(ctx), nil}
  44. }
  45. func (l *logrusLogger) WithPrefix(prefix string) Logger {
  46. if entry, isEntry := l.abstractLogrusLogger.(*logrus.Entry); isEntry {
  47. loadedPrefix := entry.Data["prefix"]
  48. if loadedPrefix != "" {
  49. prefix = F.ToString(loadedPrefix, prefix)
  50. }
  51. }
  52. return &logrusLogger{l.WithField("prefix", prefix), nil}
  53. }
  54. func (l *logrusLogger) Close() error {
  55. return common.Close(common.PtrOrNil(l.output))
  56. }