1
0

log.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. logFilePath = logOptions.Output
  37. }
  38. logFormatter := Formatter{
  39. BaseTime: options.BaseTime,
  40. DisableColors: logOptions.DisableColor || logFilePath != "",
  41. DisableTimestamp: !logOptions.Timestamp && logFilePath != "",
  42. FullTimestamp: logOptions.Timestamp,
  43. TimestampFormat: "-0700 2006-01-02 15:04:05",
  44. }
  45. factory := NewDefaultFactory(
  46. options.Context,
  47. logFormatter,
  48. logWriter,
  49. logFilePath,
  50. options.PlatformWriter,
  51. options.Observable,
  52. )
  53. if logOptions.Level != "" {
  54. logLevel, err := ParseLevel(logOptions.Level)
  55. if err != nil {
  56. return nil, E.Cause(err, "parse log level")
  57. }
  58. factory.SetLevel(logLevel)
  59. } else {
  60. factory.SetLevel(LevelTrace)
  61. }
  62. return factory, nil
  63. }