如何降低Java中的日志记录频率?

时间:2015-10-16 17:25:55

标签: java logging

我在java环境中使用java日志记录(默认提供)。

我想问一下如何汇总我的读数和日志让我们每秒说一次而不是更频繁(我似乎每秒记录20次)。 怎么办?

我可以使用哪些设置来减少数据压缩的频率吗? 我以前从未登录过,所以我不确定是否可能。谢谢。

编辑:我正在记录响应时间,吞吐量和类似的东西。由于我的程序很重,我希望jul缓冲和记录的次数较少。

1 个答案:

答案 0 :(得分:2)

要使用JUL自定义日志记录,您可以编写自己的Handler实施。如果要登录文件,则应扩展FileHandler。使用ConsoleHandler的实现可能如下所示:

package my.logging;

import java.util.Queue;
import java.util.concurrent.*;
import java.util.logging.ConsoleHandler;
import java.util.logging.LogRecord;

public class BufferingHandler extends ConsoleHandler implements AutoCloseable {

    private final Queue<LogRecord> logRecordsFifo = new ConcurrentLinkedQueue<>();
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public BufferingHandler(final int delay, final TimeUnit timeUnit) {
        super();
        scheduler.scheduleWithFixedDelay(() -> handleLogs(), delay, delay, timeUnit);
    }

    private void handleLogs() {
        while (!logRecordsFifo.isEmpty()) {
            // sync is required to preserve logs order when flushing
            synchronized (logRecordsFifo) { 
                final LogRecord log = logRecordsFifo.poll();
                if (log != null) super.publish(log);
            }
        }
    }

    @Override
    public void publish(final LogRecord record) {
        if (!isLoggable(record)) return;
        logRecordsFifo.add(record);
    }

    @Override
    public void flush() {
        handleLogs();
        super.flush();
    }

    @Override
    public void close() {
        scheduler.shutdown();
        flush();
        super.close();
    }
}

此处理程序的用法如下所示:

import my.logging.BufferingHandler;

import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

public class App {

    public static void main(String[] args) throws InterruptedException {
        final Logger logger = Logger.getLogger(App.class.getName());
        try (final BufferingHandler bufferingHandler = new BufferingHandler(1, TimeUnit.SECONDS)) {
            logger.addHandler(bufferingHandler);
            for (int i = 0; i < 30; ++i) {
                Thread.sleep(200);
                logger.info("some info: " + i);
            }
        }
    }

}