1
0

log.go 1.5 KB

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