From 8a96b8bec485dfe2e4a7a5afd49894040c6cc69f Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 12 Dec 2024 15:47:18 +0700 Subject: [PATCH] cmd/cli: adopt FilteredLevelWriter when doing internal logging Without verbose log, we use internal log writer with log level set to debug. However, this will affect other writers, like console log, since they are default to notice level. By adopting FilteredLevelWriter, we can make internal log writer run in debug level, but all others will run in default level instead. --- cmd/cli/cli.go | 4 ++-- cmd/cli/log_writer.go | 22 +++++++++++++++++----- cmd/cli/main.go | 15 ++++++++------- cmd/cli/prog.go | 4 ++-- go.mod | 2 +- go.sum | 12 +++++------- 6 files changed, 35 insertions(+), 24 deletions(-) diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 21d2873..74919d9 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -266,10 +266,10 @@ func run(appCallback *AppCallback, stopCh chan struct{}) { // Log config do not have thing to validate, so it's safe to init log here, // so it's able to log information in processCDFlags. - initLogging() + logWriters := initLogging() // Initializing internal logging after global logging. - p.initInternalLogging() + p.initInternalLogging(logWriters) mainLog.Load().Info().Msgf("starting ctrld %s", curVersion()) mainLog.Load().Info().Msgf("os: %s", osVersion()) diff --git a/cmd/cli/log_writer.go b/cmd/cli/log_writer.go index f84b231..32cf196 100644 --- a/cmd/cli/log_writer.go +++ b/cmd/cli/log_writer.go @@ -3,6 +3,7 @@ package cli import ( "bytes" "errors" + "io" "os" "sync" "time" @@ -59,7 +60,7 @@ func (lw *logWriter) Write(p []byte) (int, error) { } // initInternalLogging performs internal logging if there's no log enabled. -func (p *prog) initInternalLogging() { +func (p *prog) initInternalLogging(writers []io.Writer) { if !p.needInternalLogging() { return } @@ -72,13 +73,24 @@ func (p *prog) initInternalLogging() { p.mu.Lock() lw := p.internalLogWriter p.mu.Unlock() - multi := zerolog.MultiLevelWriter(lw) + // If ctrld was run without explicit verbose level, + // run the internal logging at debug level, so we could + // have enough information for troubleshooting. + if verbose == 0 { + for i := range writers { + w := &zerolog.FilteredLevelWriter{ + Writer: zerolog.LevelWriterAdapter{Writer: writers[i]}, + Level: zerolog.NoticeLevel, + } + writers[i] = w + } + zerolog.SetGlobalLevel(zerolog.DebugLevel) + } + writers = append(writers, lw) + multi := zerolog.MultiLevelWriter(writers...) l := mainLog.Load().Output(multi).With().Logger() mainLog.Store(&l) ctrld.ProxyLogger.Store(&l) - if verbose == 0 { - zerolog.SetGlobalLevel(zerolog.DebugLevel) - } } // needInternalLogging reports whether prog needs to run internal logging. diff --git a/cmd/cli/main.go b/cmd/cli/main.go index bafcde1..53662aa 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -101,9 +101,9 @@ func initConsoleLogging() { } // initLogging initializes global logging setup. -func initLogging() { +func initLogging() []io.Writer { zerolog.TimeFieldFormat = time.RFC3339 + ".000" - initLoggingWithBackup(true) + return initLoggingWithBackup(true) } // initLoggingWithBackup initializes log setup base on current config. @@ -112,8 +112,8 @@ func initLogging() { // This is only used in runCmd for special handling in case of logging config // change in cd mode. Without special reason, the caller should use initLogging // wrapper instead of calling this function directly. -func initLoggingWithBackup(doBackup bool) { - writers := []io.Writer{io.Discard} +func initLoggingWithBackup(doBackup bool) []io.Writer { + var writers []io.Writer if logFilePath := normalizeLogFilePath(cfg.Service.LogPath); logFilePath != "" { // Create parent directory if necessary. if err := os.MkdirAll(filepath.Dir(logFilePath), 0750); err != nil { @@ -151,21 +151,22 @@ func initLoggingWithBackup(doBackup bool) { switch { case silent: zerolog.SetGlobalLevel(zerolog.NoLevel) - return + return writers case verbose == 1: logLevel = "info" case verbose > 1: logLevel = "debug" } if logLevel == "" { - return + return writers } level, err := zerolog.ParseLevel(logLevel) if err != nil { mainLog.Load().Warn().Err(err).Msg("could not set log level") - return + return writers } zerolog.SetGlobalLevel(level) + return writers } func initCache() { diff --git a/cmd/cli/prog.go b/cmd/cli/prog.go index c6146ea..046c0c9 100644 --- a/cmd/cli/prog.go +++ b/cmd/cli/prog.go @@ -514,13 +514,13 @@ func (p *prog) run(reload bool, reloadCh chan struct{}) { if !reload { // Stop writing log to unix socket. consoleWriter.Out = os.Stdout - initLoggingWithBackup(false) + logWriters := initLoggingWithBackup(false) if p.logConn != nil { _ = p.logConn.Close() } go p.apiConfigReload() p.postRun() - p.initInternalLogging() + p.initInternalLogging(logWriters) } wg.Wait() } diff --git a/go.mod b/go.mod index 1f797e8..630ce44 100644 --- a/go.mod +++ b/go.mod @@ -102,4 +102,4 @@ require ( replace github.com/mr-karan/doggo => github.com/Windscribe/doggo v0.0.0-20220919152748-2c118fc391f8 -replace github.com/rs/zerolog => github.com/Windscribe/zerolog v0.0.0-20230503170159-e6aa153233be +replace github.com/rs/zerolog => github.com/Windscribe/zerolog v0.0.0-20241206130353-cc6e8ef5397c diff --git a/go.sum b/go.sum index 5e073b9..ead3c24 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Windscribe/zerolog v0.0.0-20230503170159-e6aa153233be h1:qBKVRi7Mom5heOkyZ+NCIu9HZBiNCsRqrRe5t9pooik= -github.com/Windscribe/zerolog v0.0.0-20230503170159-e6aa153233be/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/Windscribe/zerolog v0.0.0-20241206130353-cc6e8ef5397c h1:UqFsxmwiCh/DBvwJB0m7KQ2QFDd6DdUkosznfMppdhE= +github.com/Windscribe/zerolog v0.0.0-20241206130353-cc6e8ef5397c/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo= @@ -209,11 +209,10 @@ github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -279,7 +278,7 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= @@ -477,15 +476,14 @@ golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=