diff --git a/go.mod b/go.mod index 990b7db4..c5530c14 100644 --- a/go.mod +++ b/go.mod @@ -20,5 +20,6 @@ require ( golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e golang.org/x/sys v0.0.0-20200331124033-c3d80250170d + gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/yaml.v2 v2.2.8 ) diff --git a/go.sum b/go.sum index 4eda4dc9..4a7131a3 100644 --- a/go.sum +++ b/go.sum @@ -159,6 +159,8 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/home/config.go b/home/config.go index f453a732..341c7d96 100644 --- a/home/config.go +++ b/home/config.go @@ -24,8 +24,13 @@ const ( // logSettings type logSettings struct { - LogFile string `yaml:"log_file"` // Path to the log file. If empty, write to stdout. If "syslog", writes to syslog - Verbose bool `yaml:"verbose"` // If true, verbose logging is enabled + LogCompress bool `yaml:"log_compress"` // Compress determines if the rotated log files should be compressed using gzip (default: false) + LogLocalTime bool `yaml:"log_localtime"` // If the time used for formatting the timestamps in is the computer's local time (default: false [UTC]) + LogMaxBackups int `yaml:"log_max_backups"` // Maximum number of old log files to retain (MaxAge may still cause them to get deleted) + LogMaxSize int `yaml:"log_max_size"` // Maximum size in megabytes of the log file before it gets rotated (default 100 MB) + LogMaxAge int `yaml:"log_max_age"` // MaxAge is the maximum number of days to retain old log files + LogFile string `yaml:"log_file"` // Path to the log file. If empty, write to stdout. If "syslog", writes to syslog + Verbose bool `yaml:"verbose"` // If true, verbose logging is enabled } // configuration is loaded from YAML @@ -131,6 +136,13 @@ var config = configuration{ LeaseDuration: 86400, ICMPTimeout: 1000, }, + logSettings: logSettings{ + LogCompress: false, + LogLocalTime: false, + LogMaxBackups: 0, + LogMaxSize: 100, + LogMaxAge: 0, + }, SchemaVersion: currentSchemaVersion, } diff --git a/home/home.go b/home/home.go index 579101cf..becedbbb 100644 --- a/home/home.go +++ b/home/home.go @@ -6,6 +6,7 @@ import ( "crypto/tls" "crypto/x509" "fmt" + "gopkg.in/natefinch/lumberjack.v2" "io" "io/ioutil" "net" @@ -396,13 +397,22 @@ func configureLogger(args options) { ls := getLogSettings() // command-line arguments can override config settings - if args.verbose { + if args.verbose || config.Verbose { ls.Verbose = true } if args.logFile != "" { ls.LogFile = args.logFile + } else if config.LogFile != "" { + ls.LogFile = config.LogFile } + // Handle default log settings overrides + ls.LogCompress = config.LogCompress + ls.LogLocalTime = config.LogLocalTime + ls.LogMaxBackups = config.LogMaxBackups + ls.LogMaxSize = config.LogMaxSize + ls.LogMaxAge = config.LogMaxAge + // log.SetLevel(log.INFO) - default if ls.Verbose { log.SetLevel(log.DEBUG) @@ -414,6 +424,7 @@ func configureLogger(args options) { ls.LogFile = configSyslog } + // logs are written to stdout (default) if ls.LogFile == "" { return } @@ -430,11 +441,19 @@ func configureLogger(args options) { logFilePath = ls.LogFile } - file, err := os.OpenFile(logFilePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) + _, err := os.OpenFile(logFilePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err != nil { log.Fatalf("cannot create a log file: %s", err) } - log.SetOutput(file) + + log.SetOutput(&lumberjack.Logger{ + Filename: logFilePath, + Compress: ls.LogCompress, // disabled by default + LocalTime: ls.LogLocalTime, + MaxBackups: ls.LogMaxBackups, + MaxSize: ls.LogMaxSize, // megabytes + MaxAge: ls.LogMaxAge, //days + }) } }