Fix Windows logging to files (#11960)

This commit is contained in:
Chris S. Kim 2022-01-06 16:07:09 -05:00 committed by GitHub
parent b13fb553ac
commit c9735476a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 5 deletions

3
.changelog/11960.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
windows: Fixes a bug with empty log files when Consul is run as a Windows Service
```

View File

@ -27,16 +27,16 @@ type Config struct {
// SyslogFacility is the destination for syslog forwarding. // SyslogFacility is the destination for syslog forwarding.
SyslogFacility string SyslogFacility string
//LogFilePath is the path to write the logs to the user specified file. // LogFilePath is the path to write the logs to the user specified file.
LogFilePath string LogFilePath string
//LogRotateDuration is the user specified time to rotate logs // LogRotateDuration is the user specified time to rotate logs
LogRotateDuration time.Duration LogRotateDuration time.Duration
//LogRotateBytes is the user specified byte limit to rotate logs // LogRotateBytes is the user specified byte limit to rotate logs
LogRotateBytes int LogRotateBytes int
//LogRotateMaxFiles is the maximum number of past archived log files to keep // LogRotateMaxFiles is the maximum number of past archived log files to keep
LogRotateMaxFiles int LogRotateMaxFiles int
} }
@ -45,6 +45,17 @@ const defaultRotateDuration = 24 * time.Hour
type LogSetupErrorFn func(string) type LogSetupErrorFn func(string)
// noErrorWriter is a wrapper to suppress errors when writing to w.
type noErrorWriter struct {
w io.Writer
}
func (w noErrorWriter) Write(p []byte) (n int, err error) {
_, _ = w.w.Write(p)
// We purposely return n == len(p) as if write was successful
return len(p), nil
}
// Setup logging from Config, and return an hclog Logger. // Setup logging from Config, and return an hclog Logger.
// //
// Logs may be written to out, and optionally to syslog, and a file. // Logs may be written to out, and optionally to syslog, and a file.
@ -55,7 +66,10 @@ func Setup(config Config, out io.Writer) (hclog.InterceptLogger, error) {
allowedLogLevels) allowedLogLevels)
} }
writers := []io.Writer{out} // If out is os.Stdout and Consul is being run as a Windows Service, writes will
// fail silently, which may inadvertently prevent writes to other writers.
// noErrorWriter is used as a wrapper to suppress any errors when writing to out.
writers := []io.Writer{noErrorWriter{w: out}}
if config.EnableSyslog { if config.EnableSyslog {
retries := 12 retries := 12