Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按时间(频率)筛选日志消息?_Java_Logging_Filtering_Logback - Fatal编程技术网

Java 按时间(频率)筛选日志消息?

Java 按时间(频率)筛选日志消息?,java,logging,filtering,logback,Java,Logging,Filtering,Logback,我有一些经常发生日志事件的过程。有没有办法按频率过滤该类事件?例如,每秒不超过1条消息或其他内容 我将重点放在logback上。您可以查看logback过滤器 具体来说,请看DuplicateMessageFilter。如果这还不够,您可以尝试扩展它并实现类似的功能。这里有一种方法,使用a和a: 专用队列消息=新建ConcurrentLinkedQueue(); 私有int messagesPerSecond=3; private ScheduleXecutorService ses=执行者。

我有一些经常发生日志事件的过程。有没有办法按频率过滤该类事件?例如,每秒不超过1条消息或其他内容


我将重点放在logback上。

您可以查看logback过滤器

具体来说,请看DuplicateMessageFilter。如果这还不够,您可以尝试扩展它并实现类似的功能。

这里有一种方法,使用a和a:

专用队列消息=新建ConcurrentLinkedQueue();
私有int messagesPerSecond=3;
private ScheduleXecutorService ses=执行者。NewsingleThreadScheduleXecutor();
private Runnable scheduledTask=new Runnable()
{
@凌驾
公开募捐
{
LogMessage=messages.poll();
如果(消息!=null)打印消息(消息);
}
};
// ...
ses.scheduleAtFixedRate(,0,1000/messagesPerSecond,TimeUnit.ms);

而不是直接打印消息,而是将消息放入队列,计划的任务将处理它。

这是日志记录的自定义行为,您有几种选择:1-要减少日志记录的类别的自定义日志记录程序(因为这不是常见的使用场景),2-降低日志记录级别(ie DEBUG,而不是INFO,用于日志重复次数太多),3-AOP用于日志事件,添加逻辑以忽略相应类别中的重复日志。我将使用2,只记录重要且不太重复的内容。例如,您可以将这些调试日志发送到单独的文件。
private Queue<LogMessage> messages = new ConcurrentLinkedQueue<LogMessage>();
private int messagesPerSecond = 3;
private ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

private Runnable scheduledTask = new Runnable()
{
    @Override
    public void run()
    {
        LogMessage message = messages.poll();
        if(message != null) printMessage(message);
    }
};

// ...

ses.scheduleAtFixedRate(, 0, 1000/messagesPerSecond, TimeUnit.MILLISECONDS);