我有一些经常发生日志事件的程序。有什么方法可以按频率过滤该类中的事件吗?例如,每秒不超过 1 条消息或其他什么?
我专注于logback。
这是一种方法,使用 aConcurrentLinkedQueue
和 a ScheduledExecutorService
:
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);
而不是直接打印消息,而是将其放入队列中,计划任务将处理它。
您可以查看 logback 过滤器 http://logback.qos.ch/manual/filters.html
具体来说,看看 DuplicateMessageFilter。如果这还不够,您可以尝试扩展它并实现类似的东西。