log.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package log
  2. import (
  3. "context"
  4. "io"
  5. "os"
  6. "time"
  7. "github.com/sagernet/sing-box/option"
  8. E "github.com/sagernet/sing/common/exceptions"
  9. )
  10. type Options struct {
  11. Context context.Context
  12. Options option.LogOptions
  13. Observable bool
  14. DefaultWriter io.Writer
  15. BaseTime time.Time
  16. PlatformWriter PlatformWriter
  17. }
  18. func New(options Options) (Factory, error) {
  19. logOptions := options.Options
  20. if logOptions.Disabled {
  21. return NewNOPFactory(), nil
  22. }
  23. var logWriter io.Writer
  24. var logFilePath string
  25. switch logOptions.Output {
  26. case "":
  27. logWriter = options.DefaultWriter
  28. if logWriter == nil {
  29. logWriter = os.Stderr
  30. }
  31. case "stderr":
  32. logWriter = os.Stderr
  33. case "stdout":
  34. logWriter = os.Stdout
  35. default:
  36. logWriter = io.Discard
  37. logFilePath = logOptions.Output
  38. }
  39. logFormatter := Formatter{
  40. BaseTime: options.BaseTime,
  41. DisableColors: logOptions.DisableColor || logFilePath != "",
  42. DisableTimestamp: !logOptions.Timestamp && logFilePath != "",
  43. FullTimestamp: logOptions.Timestamp,
  44. TimestampFormat: "-0700 2006-01-02 15:04:05",
  45. }
  46. factory := NewDefaultFactory(
  47. options.Context,
  48. logFormatter,
  49. logWriter,
  50. logFilePath,
  51. options.PlatformWriter,
  52. options.Observable,
  53. )
  54. if logOptions.Level != "" {
  55. logLevel, err := ParseLevel(logOptions.Level)
  56. if err != nil {
  57. return nil, E.Cause(err, "parse log level")
  58. }
  59. factory.SetLevel(logLevel)
  60. } else {
  61. factory.SetLevel(LevelTrace)
  62. }
  63. return factory, nil
  64. }