@@ -22,7 +22,6 @@ import (
2222 "net/http"
2323 _ "net/http/pprof"
2424 "os"
25- "path"
2625 "path/filepath"
2726 "runtime"
2827
7978 Usage : "Prepends log messages with call-site location (file and line number)" ,
8079 Category : flags .LoggingCategory ,
8180 }
82- logLocationFlag = & flags.DirectoryFlag {
83- Name : "log.folder" ,
84- Usage : "Location where the log files should be placed" ,
85- Value : flags .DirectoryString ("./logs/" ),
86- Category : flags .LoggingCategory ,
81+ logRotateFlag = & cli.BoolFlag {
82+ Name : "log.rotate" ,
83+ Usage : "Enables log file rotation" ,
8784 }
8885 logMaxSizeMBsFlag = & cli.IntFlag {
8986 Name : "log.maxsize" ,
@@ -153,12 +150,12 @@ var (
153150var Flags = []cli.Flag {
154151 verbosityFlag ,
155152 vmoduleFlag ,
153+ backtraceAtFlag ,
154+ debugFlag ,
156155 logjsonFlag ,
157156 logFormatFlag ,
158157 logFileFlag ,
159- backtraceAtFlag ,
160- debugFlag ,
161- logLocationFlag ,
158+ logRotateFlag ,
162159 logMaxSizeMBsFlag ,
163160 logMaxBackupsFlag ,
164161 logMaxAgeFlag ,
@@ -186,59 +183,65 @@ func init() {
186183// Setup initializes profiling and logging based on the CLI flags.
187184// It should be called as early as possible in the program.
188185func Setup (ctx * cli.Context ) error {
189- output := io .Writer (os .Stderr )
190- var logfmt log.Format
191- ttyHasColor := (isatty .IsTerminal (os .Stderr .Fd ()) || isatty .IsCygwinTerminal (os .Stderr .Fd ())) && os .Getenv ("TERM" ) != "dumb"
192-
193- switch ctx .String (logFormatFlag .Name ) {
194- case "json" :
186+ var (
187+ logfmt log.Format
188+ output = io .Writer (os .Stderr )
189+ logFmtFlag = ctx .String (logFormatFlag .Name )
190+ )
191+ switch {
192+ case ctx .Bool (logjsonFlag .Name ):
193+ // Retain backwards compatibility with `--log.json` flag if `--log.format` not set
194+ defer log .Warn ("The flag '--log.json' is deprecated, please use '--log.format=json' instead" )
195+ logfmt = log .JSONFormat ()
196+ case logFmtFlag == "json" :
195197 logfmt = log .JSONFormat ()
196- case "logfmt" :
198+ case logFmtFlag == "logfmt" :
197199 logfmt = log .LogfmtFormat ()
198- case "terminal" :
199- logfmt = log .TerminalFormat (ttyHasColor )
200- case "" :
201- // Retain backwards compatibility with `--log.json` flag if `--log.format` not set
202- if ctx .Bool (logjsonFlag .Name ) {
203- defer log .Warn ("The flag '--log.json' is deprecated, please use '--log.format=json' instead" )
204- logfmt = log .JSONFormat ()
205- } else {
206- logfmt = log .TerminalFormat (ttyHasColor )
200+ case logFmtFlag == "" , logFmtFlag == "terminal" :
201+ useColor := (isatty .IsTerminal (os .Stderr .Fd ()) || isatty .IsCygwinTerminal (os .Stderr .Fd ())) && os .Getenv ("TERM" ) != "dumb"
202+ if useColor {
203+ output = colorable .NewColorableStderr ()
207204 }
205+ logfmt = log .TerminalFormat (useColor )
208206 default :
209207 // Unknown log format specified
210208 return fmt .Errorf ("unknown log format: %v" , ctx .String (logFormatFlag .Name ))
211209 }
212-
213- if logFile != "" {
214- var err error
215- logOutputStream , err = log .FileHandler (logFile , logfmt )
216- if err != nil {
217- return err
218- }
219- } else {
220- if ttyHasColor {
221- output = colorable .NewColorableStderr ()
210+ var (
211+ stdHandler = log .StreamHandler (output , logfmt )
212+ ostream = stdHandler
213+ logFile = ctx .String (logFileFlag .Name )
214+ rotation = ctx .Bool (logRotateFlag .Name )
215+ )
216+ if len (logFile ) > 0 {
217+ if err := validateLogLocation (filepath .Dir (logFile )); err != nil {
218+ return fmt .Errorf ("failed to initiatilize file logger: %v" , err )
222219 }
223- logfmt = log .TerminalFormat (ttyHasColor )
224220 }
225-
226- stdHandler := log .StreamHandler (output , logfmt )
227- ostream := stdHandler
228- if folder := ctx .String (logLocationFlag .Name ); folder != "" {
229- if err := validateLogLocation (folder ); err != nil {
230- return fmt .Errorf ("failed to initiatilize file logger: %v" , err )
221+ if rotation {
222+ // Lumberjack uses <processname>-lumberjack.log in is.TempDir() if empty.
223+ // so typically /tmp/geth-lumberjack.log on linux
224+ if len (logFile ) > 0 {
225+ log .Info ("Rotating file logging configured" , "location" , logFile )
226+ } else {
227+ log .Info ("Rotating file logging configured" , "location" ,
228+ filepath .Join (os .TempDir (), "geth-lumberjack.log" ))
231229 }
232- lumberjackHandler := log .StreamHandler (& lumberjack.Logger {
233- Filename : path . Join ( folder , "log.log" ) ,
230+ ostream = log . MultiHandler ( log .StreamHandler (& lumberjack.Logger {
231+ Filename : logFile ,
234232 MaxSize : ctx .Int (logMaxSizeMBsFlag .Name ),
235233 MaxBackups : ctx .Int (logMaxBackupsFlag .Name ),
236234 MaxAge : ctx .Int (logMaxAgeFlag .Name ),
237235 Compress : ctx .Bool (logCompressFlag .Name ),
238- }, logfmt )
239- ostream = log .MultiHandler (lumberjackHandler , stdHandler )
236+ }, logfmt ), stdHandler )
237+ } else if logFile != "" {
238+ if logOutputStream , err := log .FileHandler (logFile , logfmt ); err != nil {
239+ return err
240+ } else {
241+ ostream = log .MultiHandler (logOutputStream , stdHandler )
242+ log .Info ("File logging configured" , "location" , logFile )
243+ }
240244 }
241-
242245 glogger .SetHandler (ostream )
243246
244247 // logging
0 commit comments