1

我可以使用配置文件根据时间间隔刷新所有日志吗?搜索了很多。没找到。捷径是自己使用 Timer 并刷新所有记录器。但想知道配置文件是否允许。

4

1 回答 1

2

LogManager文档中解释了配置文件选项。目前,唯一的方法是通过配置文件,使用 'config' 选项安装自定义代码以刷新所有记录器并执行计时器管理。如果您需要访问 JVM 生命周期,您可以创建一个自定义处理程序,该处理程序忽略所有日志记录但侦听构造函数和关闭方法调用。

public class FlushAllHandler extends Handler {

    private final ScheduledExecutorService ses;
    private final Future<?> task;

    public FlushAllHandler() {
        //TODO: Look these up from the LogManager.
        super.setLevel(Level.OFF); //Ignore all published records.
        ses = Executors.newScheduledThreadPool(1);
        long delay = 1L;
        TimeUnit unit = TimeUnit.HOURS;
        task = ses.scheduleWithFixedDelay(new Task(), delay, delay, unit);
    }

    @Override
    public void publish(LogRecord record) {
        //Allow a trigger filter to kick off a flush.
        if (isLoggable(record)) {
            ses.execute(new Task());
        }
    }

    @Override
    public void flush() {
    }

    @Override
    public void close() throws SecurityException {
        super.setLevel(Level.OFF);
        task.cancel(false);
        ses.shutdown();
        try {
            ses.awaitTermination(30, TimeUnit.SECONDS);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        ses.shutdownNow();
    }

    private static class Task implements Runnable {

        Task() {
        }

        @Override
        public void run() {
            final ArrayList<Handler> handlers = new ArrayList<>();
            final LogManager manager = LogManager.getLogManager();
            synchronized (manager) { //avoid ConcurrentModificationException
                final Enumeration<String> e = manager.getLoggerNames();
                while (e.hasMoreElements()) {
                    final Logger l = manager.getLogger(e.nextElement());
                    if (l != null) {
                        Collections.addAll(handlers, l.getHandlers());
                    }
                }
            }

            //Don't hold LogManager lock while flushing handlers.
            for (Handler h : handlers) {
                h.flush();
            }
        }
    }
}
于 2013-11-15T16:18:10.320 回答