我认为这是一个非常基本的要求,虽然难以有效实施:
在一个代码库中,我们会记录相当多的内容,具体取决于用户行为。为了便于论证,每次单击按钮都会创建一条日志消息,其中包含所单击按钮的名称。
现在,我并不关心每个点击的按钮。无论用户点击按钮的次数多少,我都非常满意每5分钟打印一条消息。
我可以在用户代码中轻松完成此操作:
private static final Logger LOG = Logger.getLogger("buttons");
private static final long LOG_ONLY_EVERY = Duration.ofMinutes( 5 ).getSeconds();
private static final Map<String, Long> loggedViolations = new HashMap<>();
public static void logClick( String buttonName )
{
String msg = "Button " + buttonName + " has been clicked";
final long epochSecond = Instant.now( Clock.systemUTC() ).getEpochSecond();
if ( !loggedViolations.containsKey( msg ) )
{
loggedViolations.put( msg, epochSecond );
}
if ( loggedViolations.get( msg ) + LOG_ONLY_EVERY < epochSecond )
{
LOG.warn( msg );
loggedViolations.put( msg, epochSecond );
}
}
我的问题是:SLF4J或Log4J可以为我做这个吗?怎么样?
是的,我知道上面的代码缺乏同步。如果上述问题的答案是&#34;不,请自己动手,#34; - 以上在多线程环境中是否安全(因为我不会删除消息)?
答案 0 :(得分:1)
使用BurstFilter并将其安装在buttons
记录器上:
BurstFilter提供了一种机制,通过在达到最大限制后以静默方式丢弃事件来控制处理LogEvent的速率。
对于Logback,请使用DuplicateMessageFilter。