我可以让Log4J暂时禁止记录特定的消息吗?

时间:2017-01-04 13:28:30

标签: java logging log4j

我认为这是一个非常基本的要求,虽然难以有效实施:

在一个代码库中,我们会记录相当多的内容,具体取决于用户行为。为了便于论证,每次单击按钮都会创建一条日志消息,其中包含所单击按钮的名称。

现在,我并不关心每个点击的按钮。无论用户点击按钮的次数多少,我都非常满意每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; - 以上在多线程环境中是否安全(因为我不会删除消息)?

1 个答案:

答案 0 :(得分:1)

使用BurstFilter并将其安装在buttons记录器上:

  

BurstFilter提供了一种机制,通过在达到最大限制后以静默方式丢弃事件来控制处理LogEvent的速率。

对于Logback,请使用DuplicateMessageFilter