From b5206ce33f26a53d07e39a731b7da59e09a28905 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 23 Jun 2020 12:41:30 +0300 Subject: [PATCH] lib/logger: add `-loggerErrorsPerSecondLimit` for limiting the rate of ERROR messages --- lib/logger/logger.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 54393423e4..a2eb5d543a 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -21,6 +21,9 @@ var ( loggerLevel = flag.String("loggerLevel", "INFO", "Minimum level of errors to log. Possible values: INFO, WARN, ERROR, FATAL, PANIC") loggerFormat = flag.String("loggerFormat", "default", "Format for logs. Possible values: default, json") loggerOutput = flag.String("loggerOutput", "stderr", "Output for the logs. Supported values: stderr, stdout") + + errorsPerSecondLimit = flag.Int("loggerErrorsPerSecondLimit", 10, "Per-second limit on the number of ERROR messages. If more than the given number of errors "+ + "are emitted per second, then the remaining errors are suppressed. Zero value disables the rate limit") ) // Init initializes the logger. @@ -123,7 +126,7 @@ func logLevelSkipframes(skipframes int, level, format string, args ...interface{ func errorsLoggedCleaner() { for { - time.Sleep(5 * time.Second) + time.Sleep(time.Second) atomic.StoreUint64(&errorsLogged, 0) } } @@ -141,7 +144,7 @@ func (lw *logWriter) Write(p []byte) (int, error) { func logMessage(level, msg string, skipframes int) { // rate limit ERROR log messages if level == "ERROR" { - if n := atomic.AddUint64(&errorsLogged, 1); n > 10 { + if n := atomic.AddUint64(&errorsLogged, 1); *errorsPerSecondLimit > 0 && n > uint64(*errorsPerSecondLimit) { return } }