package logjson import ( "io" "os" "time" "git.blauwelle.com/go/crate/synchelper" ) // Option 配置日志处理对象 type Option interface { apply(cfg *config) } // WithBufferPool 配置缓冲池 func WithBufferPool(pool synchelper.BytesBufferPool) Option { return optionFunc(func(cfg *config) { cfg.pool = pool }) } // WithOutput 配置输出 func WithOutput(w io.Writer) Option { return optionFunc(func(cfg *config) { cfg.output = w }) } // WithTimeFormat 配置时间格式 func WithTimeFormat(format string) Option { return optionFunc(func(cfg *config) { cfg.timestampFormat = format }) } // WithDisableTime 配置仅用时间输出 func WithDisableTime(disable bool) Option { return optionFunc(func(cfg *config) { cfg.disableTime = disable }) } // WithDisableHTMLEscape 配置禁止 HTML 转义 func WithDisableHTMLEscape(disable bool) Option { return optionFunc(func(cfg *config) { cfg.disableHTMLEscape = disable }) } // WithPrettyPrint 配置 JSON 多行缩进输出 func WithPrettyPrint(pretty bool) Option { return optionFunc(func(cfg *config) { cfg.prettyPrint = pretty }) } func newConfig(opts ...Option) *config { cfg := defaultConfig() for _, opt := range opts { opt.apply(cfg) } if !cfg.hasPool { cfg.pool = synchelper.NewBytesBufferPool(512, 4096) } if cfg.output == nil { cfg.output = synchelper.NewSyncWriter(os.Stderr) } if cfg.timestampFormat == "" { cfg.timestampFormat = time.RFC3339Nano } return cfg } func defaultConfig() *config { return &config{ hasPool: false, disableTime: false, disableHTMLEscape: false, prettyPrint: false, } } type config struct { pool synchelper.BytesBufferPool output io.Writer timestampFormat string hasPool bool disableTime bool disableHTMLEscape bool prettyPrint bool } type optionFunc func(cfg *config) func (fn optionFunc) apply(cfg *config) { fn(cfg) }