123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package log
- import (
- "context"
- "io"
- "os"
- "time"
- "github.com/sagernet/sing-box/option"
- "github.com/sagernet/sing/common"
- E "github.com/sagernet/sing/common/exceptions"
- "github.com/sagernet/sing/service/filemanager"
- )
- type factoryWithFile struct {
- Factory
- file *os.File
- }
- func (f *factoryWithFile) Close() error {
- return common.Close(
- f.Factory,
- common.PtrOrNil(f.file),
- )
- }
- type observableFactoryWithFile struct {
- ObservableFactory
- file *os.File
- }
- func (f *observableFactoryWithFile) Close() error {
- return common.Close(
- f.ObservableFactory,
- common.PtrOrNil(f.file),
- )
- }
- type Options struct {
- Context context.Context
- Options option.LogOptions
- Observable bool
- DefaultWriter io.Writer
- BaseTime time.Time
- PlatformWriter PlatformWriter
- }
- func New(options Options) (Factory, error) {
- logOptions := options.Options
- if logOptions.Disabled {
- return NewNOPFactory(), nil
- }
- var logFile *os.File
- var logWriter io.Writer
- switch logOptions.Output {
- case "":
- logWriter = options.DefaultWriter
- if logWriter == nil {
- logWriter = os.Stderr
- }
- case "stderr":
- logWriter = os.Stderr
- case "stdout":
- logWriter = os.Stdout
- default:
- var err error
- logFile, err = filemanager.OpenFile(options.Context, logOptions.Output, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
- if err != nil {
- return nil, err
- }
- logWriter = logFile
- }
- logFormatter := Formatter{
- BaseTime: options.BaseTime,
- DisableColors: logOptions.DisableColor || logFile != nil,
- DisableTimestamp: !logOptions.Timestamp && logFile != nil,
- FullTimestamp: logOptions.Timestamp,
- TimestampFormat: "-0700 2006-01-02 15:04:05",
- }
- var factory Factory
- if options.Observable {
- factory = NewObservableFactory(logFormatter, logWriter, options.PlatformWriter)
- } else {
- factory = NewFactory(logFormatter, logWriter, options.PlatformWriter)
- }
- if logOptions.Level != "" {
- logLevel, err := ParseLevel(logOptions.Level)
- if err != nil {
- return nil, E.Cause(err, "parse log level")
- }
- factory.SetLevel(logLevel)
- } else {
- factory.SetLevel(LevelTrace)
- }
- if logFile != nil {
- if options.Observable {
- factory = &observableFactoryWithFile{
- ObservableFactory: factory.(ObservableFactory),
- file: logFile,
- }
- } else {
- factory = &factoryWithFile{
- Factory: factory,
- file: logFile,
- }
- }
- }
- return factory, nil
- }
|