| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | package logimport (	"context"	"io"	"os"	"time"	"github.com/sagernet/sing-box/option"	E "github.com/sagernet/sing/common/exceptions")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 logWriter io.Writer	var logFilePath string	switch logOptions.Output {	case "":		logWriter = options.DefaultWriter		if logWriter == nil {			logWriter = os.Stderr		}	case "stderr":		logWriter = os.Stderr	case "stdout":		logWriter = os.Stdout	default:		logFilePath = logOptions.Output	}	logFormatter := Formatter{		BaseTime:         options.BaseTime,		DisableColors:    logOptions.DisableColor || logFilePath != "",		DisableTimestamp: !logOptions.Timestamp && logFilePath != "",		FullTimestamp:    logOptions.Timestamp,		TimestampFormat:  "-0700 2006-01-02 15:04:05",	}	factory := NewDefaultFactory(		options.Context,		logFormatter,		logWriter,		logFilePath,		options.PlatformWriter,		options.Observable,	)	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)	}	return factory, nil}
 |