@ThreadSafe
public class RateLimitedLog
extends java.lang.Object
implements org.slf4j.Logger
private static final Logger logger = LoggerFactory.getLogger(getClass());
private static final RateLimitedLog rateLimitedLog = RateLimitedLog.withRateLimit(logger)
.maxRate(5).every(Duration.ofSeconds(10))
.build();
This will wrap an existing SLF4J Logger object, allowing a max of 5 messages to be output every 10 seconds,
suppressing any more than that. When a log is suppressed, at the end of the 10-second period, another
log message is output indicating how many logs were hidden. This style of rate limiting is the same as the
one used by UNIX syslog, so should be comprehensible, easy to predict, and familiar to many users, unlike
more complex adaptive rate limits.
Each log message has its own internal rate limiting counter. In other words, if you have 2 log messages, you can
safely reuse the same RateLimitedLog object to log both, and the rate of one will not caused the other to
be suppressed as a side effect. However, this means that if you wish to include dynamic, variable data in the log
output, you will need to use SLF4J-style templates, instead of ("foo " + bar + " baz") string interpolation.
For example:
rateLimitedLog.info("Just saw an event of type {}: {}", event.getType(), event);
"{}" will implicitly invoke an object's toString() method, so toString() does not need
to be called explicitly when logging. (This has obvious performance benefits, in that
those toString() methods will not be called at all once the rate limits have been exceeded.)
Where performance is critical, note that you can obtain a reference to the RateLimitedLogWithPattern object
for an individual log template, which will avoid a ConcurrentHashMap lookup.
The RateLimitedLog objects are thread-safe.| Modifier and Type | Method and Description |
|---|---|
void |
debug(org.slf4j.Marker marker,
java.lang.String msg) |
void |
debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray) |
void |
debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg) |
void |
debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
debug(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t) |
void |
debug(java.lang.String msg) |
void |
debug(java.lang.String format,
java.lang.Object... arguments) |
void |
debug(java.lang.String format,
java.lang.Object arg) |
void |
debug(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
debug(java.lang.String msg,
java.lang.Throwable t) |
void |
error(org.slf4j.Marker marker,
java.lang.String msg) |
void |
error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray) |
void |
error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg) |
void |
error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
error(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t) |
void |
error(java.lang.String msg) |
void |
error(java.lang.String format,
java.lang.Object... arguments) |
void |
error(java.lang.String format,
java.lang.Object arg) |
void |
error(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
error(java.lang.String msg,
java.lang.Throwable t) |
RateLimitedLogWithPattern |
get(java.lang.String message) |
LogWithPatternAndLevel |
get(java.lang.String pattern,
Level level) |
java.lang.String |
getName() |
void |
info(org.slf4j.Marker marker,
java.lang.String msg) |
void |
info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray) |
void |
info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg) |
void |
info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
info(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t) |
void |
info(java.lang.String msg) |
void |
info(java.lang.String format,
java.lang.Object... arguments) |
void |
info(java.lang.String format,
java.lang.Object arg) |
void |
info(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
info(java.lang.String msg,
java.lang.Throwable t) |
boolean |
isDebugEnabled() |
boolean |
isDebugEnabled(org.slf4j.Marker marker) |
boolean |
isErrorEnabled() |
boolean |
isErrorEnabled(org.slf4j.Marker marker) |
boolean |
isInfoEnabled() |
boolean |
isInfoEnabled(org.slf4j.Marker marker) |
boolean |
isTraceEnabled() |
boolean |
isTraceEnabled(org.slf4j.Marker marker) |
boolean |
isWarnEnabled() |
boolean |
isWarnEnabled(org.slf4j.Marker marker) |
void |
trace(org.slf4j.Marker marker,
java.lang.String msg) |
void |
trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray) |
void |
trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg) |
void |
trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
trace(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t) |
void |
trace(java.lang.String msg) |
void |
trace(java.lang.String format,
java.lang.Object... arguments) |
void |
trace(java.lang.String format,
java.lang.Object arg) |
void |
trace(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
trace(java.lang.String msg,
java.lang.Throwable t) |
void |
warn(org.slf4j.Marker marker,
java.lang.String msg) |
void |
warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray) |
void |
warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg) |
void |
warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
warn(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t) |
void |
warn(java.lang.String msg) |
void |
warn(java.lang.String format,
java.lang.Object... arguments) |
void |
warn(java.lang.String format,
java.lang.Object arg) |
void |
warn(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2) |
void |
warn(java.lang.String msg,
java.lang.Throwable t) |
static RateLimitedLogBuilder.MissingRateAndPeriod |
withRateLimit(org.slf4j.Logger logger)
Start building a new RateLimitedLog, wrapping the SLF4J logger @param logger.
|
public static RateLimitedLogBuilder.MissingRateAndPeriod withRateLimit(org.slf4j.Logger logger)
public java.lang.String getName()
getName in interface org.slf4j.Loggerpublic boolean isTraceEnabled()
isTraceEnabled in interface org.slf4j.Loggerpublic void trace(java.lang.String msg)
trace in interface org.slf4j.Loggerpublic void trace(java.lang.String format,
java.lang.Object arg)
trace in interface org.slf4j.Loggerpublic void trace(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
trace in interface org.slf4j.Loggerpublic void trace(java.lang.String format,
java.lang.Object... arguments)
trace in interface org.slf4j.Loggerpublic void trace(java.lang.String msg,
java.lang.Throwable t)
trace in interface org.slf4j.Loggerpublic boolean isTraceEnabled(org.slf4j.Marker marker)
isTraceEnabled in interface org.slf4j.Loggerpublic void trace(org.slf4j.Marker marker,
java.lang.String msg)
trace in interface org.slf4j.Loggerpublic void trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg)
trace in interface org.slf4j.Loggerpublic void trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
trace in interface org.slf4j.Loggerpublic void trace(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray)
trace in interface org.slf4j.Loggerpublic void trace(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t)
trace in interface org.slf4j.Loggerpublic boolean isDebugEnabled()
isDebugEnabled in interface org.slf4j.Loggerpublic void debug(java.lang.String msg)
debug in interface org.slf4j.Loggerpublic void debug(java.lang.String format,
java.lang.Object arg)
debug in interface org.slf4j.Loggerpublic void debug(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
debug in interface org.slf4j.Loggerpublic void debug(java.lang.String format,
java.lang.Object... arguments)
debug in interface org.slf4j.Loggerpublic void debug(java.lang.String msg,
java.lang.Throwable t)
debug in interface org.slf4j.Loggerpublic boolean isDebugEnabled(org.slf4j.Marker marker)
isDebugEnabled in interface org.slf4j.Loggerpublic void debug(org.slf4j.Marker marker,
java.lang.String msg)
debug in interface org.slf4j.Loggerpublic void debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg)
debug in interface org.slf4j.Loggerpublic void debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
debug in interface org.slf4j.Loggerpublic void debug(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray)
debug in interface org.slf4j.Loggerpublic void debug(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t)
debug in interface org.slf4j.Loggerpublic boolean isInfoEnabled()
isInfoEnabled in interface org.slf4j.Loggerpublic void info(java.lang.String msg)
info in interface org.slf4j.Loggerpublic void info(java.lang.String format,
java.lang.Object arg)
info in interface org.slf4j.Loggerpublic void info(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
info in interface org.slf4j.Loggerpublic void info(java.lang.String format,
java.lang.Object... arguments)
info in interface org.slf4j.Loggerpublic void info(java.lang.String msg,
java.lang.Throwable t)
info in interface org.slf4j.Loggerpublic boolean isInfoEnabled(org.slf4j.Marker marker)
isInfoEnabled in interface org.slf4j.Loggerpublic void info(org.slf4j.Marker marker,
java.lang.String msg)
info in interface org.slf4j.Loggerpublic void info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg)
info in interface org.slf4j.Loggerpublic void info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
info in interface org.slf4j.Loggerpublic void info(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray)
info in interface org.slf4j.Loggerpublic void info(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t)
info in interface org.slf4j.Loggerpublic boolean isWarnEnabled()
isWarnEnabled in interface org.slf4j.Loggerpublic void warn(java.lang.String msg)
warn in interface org.slf4j.Loggerpublic void warn(java.lang.String format,
java.lang.Object arg)
warn in interface org.slf4j.Loggerpublic void warn(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
warn in interface org.slf4j.Loggerpublic void warn(java.lang.String format,
java.lang.Object... arguments)
warn in interface org.slf4j.Loggerpublic void warn(java.lang.String msg,
java.lang.Throwable t)
warn in interface org.slf4j.Loggerpublic boolean isWarnEnabled(org.slf4j.Marker marker)
isWarnEnabled in interface org.slf4j.Loggerpublic void warn(org.slf4j.Marker marker,
java.lang.String msg)
warn in interface org.slf4j.Loggerpublic void warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg)
warn in interface org.slf4j.Loggerpublic void warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
warn in interface org.slf4j.Loggerpublic void warn(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray)
warn in interface org.slf4j.Loggerpublic void warn(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t)
warn in interface org.slf4j.Loggerpublic boolean isErrorEnabled()
isErrorEnabled in interface org.slf4j.Loggerpublic void error(java.lang.String msg)
error in interface org.slf4j.Loggerpublic void error(java.lang.String format,
java.lang.Object arg)
error in interface org.slf4j.Loggerpublic void error(java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
error in interface org.slf4j.Loggerpublic void error(java.lang.String format,
java.lang.Object... arguments)
error in interface org.slf4j.Loggerpublic void error(java.lang.String msg,
java.lang.Throwable t)
error in interface org.slf4j.Loggerpublic boolean isErrorEnabled(org.slf4j.Marker marker)
isErrorEnabled in interface org.slf4j.Loggerpublic void error(org.slf4j.Marker marker,
java.lang.String msg)
error in interface org.slf4j.Loggerpublic void error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg)
error in interface org.slf4j.Loggerpublic void error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object arg1,
java.lang.Object arg2)
error in interface org.slf4j.Loggerpublic void error(org.slf4j.Marker marker,
java.lang.String format,
java.lang.Object... argArray)
error in interface org.slf4j.Loggerpublic void error(org.slf4j.Marker marker,
java.lang.String msg,
java.lang.Throwable t)
error in interface org.slf4j.Loggerpublic RateLimitedLogWithPattern get(java.lang.String message)
java.lang.IllegalStateException - if we exceed the limit on number of RateLimitedLogWithPattern objects
in any one period; if this happens, it's probable that an already-interpolated string is
accidentally being used as a log pattern.public LogWithPatternAndLevel get(java.lang.String pattern, Level level)
level - . This can be cached and reused by callers in performance-sensitive
cases to avoid performing two ConcurrentHashMap lookups.
Note that the string is the sole key used, so the same string cannot be reused with differing period
settings; any periods which differ from the first one used are ignored.java.lang.IllegalStateException - if we exceed the limit on number of RateLimitedLogWithPattern objects
in any one period; if this happens, it's probable that an already-interpolated string is
accidentally being used as a log pattern.