mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-07-27 21:50:09 +00:00
TUN-7127: Disconnect logger level requirement for management
By default, we want streaming logs to be able to stream debug logs from cloudflared without needing to update the remote cloudflared's configuration. This disconnects the provided local log level sent to console, file, etc. from the level that management tunnel will utilize via requested filters.
This commit is contained in:
@@ -64,17 +64,36 @@ func fallbackLogger(err error) *zerolog.Logger {
|
||||
return &failLog
|
||||
}
|
||||
|
||||
type resilientMultiWriter struct {
|
||||
writers []io.Writer
|
||||
}
|
||||
|
||||
// This custom resilientMultiWriter is an alternative to zerolog's so that we can make it resilient to individual
|
||||
// resilientMultiWriter is an alternative to zerolog's so that we can make it resilient to individual
|
||||
// writer's errors. E.g., when running as a Windows service, the console writer fails, but we don't want to
|
||||
// allow that to prevent all logging to fail due to breaking the for loop upon an error.
|
||||
type resilientMultiWriter struct {
|
||||
level zerolog.Level
|
||||
writers []io.Writer
|
||||
managementWriter zerolog.LevelWriter
|
||||
}
|
||||
|
||||
func (t resilientMultiWriter) Write(p []byte) (n int, err error) {
|
||||
for _, w := range t.writers {
|
||||
_, _ = w.Write(p)
|
||||
}
|
||||
if t.managementWriter != nil {
|
||||
_, _ = t.managementWriter.Write(p)
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func (t resilientMultiWriter) WriteLevel(level zerolog.Level, p []byte) (n int, err error) {
|
||||
// Only write the event to normal writers if it exceeds the level, but always write to the
|
||||
// management logger and let it decided with the provided level of the log event.
|
||||
if t.level <= level {
|
||||
for _, w := range t.writers {
|
||||
_, _ = w.Write(p)
|
||||
}
|
||||
}
|
||||
if t.managementWriter != nil {
|
||||
_, _ = t.managementWriter.WriteLevel(level, p)
|
||||
}
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
@@ -105,17 +124,18 @@ func newZerolog(loggerConfig *Config) *zerolog.Logger {
|
||||
writers = append(writers, rollingLogger)
|
||||
}
|
||||
|
||||
var managementWriter zerolog.LevelWriter
|
||||
if features.Contains(features.FeatureManagementLogs) {
|
||||
writers = append(writers, ManagementLogger)
|
||||
managementWriter = ManagementLogger
|
||||
}
|
||||
|
||||
multi := resilientMultiWriter{writers}
|
||||
|
||||
level, levelErr := zerolog.ParseLevel(loggerConfig.MinLevel)
|
||||
if levelErr != nil {
|
||||
level = zerolog.InfoLevel
|
||||
}
|
||||
log := zerolog.New(multi).With().Timestamp().Logger().Level(level)
|
||||
|
||||
multi := resilientMultiWriter{level, writers, managementWriter}
|
||||
log := zerolog.New(multi).With().Timestamp().Logger()
|
||||
if !levelErrorLogged && levelErr != nil {
|
||||
log.Error().Msgf("Failed to parse log level %q, using %q instead", loggerConfig.MinLevel, level)
|
||||
levelErrorLogged = true
|
||||
|
Reference in New Issue
Block a user