Java.util.logging 定期java日志记录

Java.util.logging 定期java日志记录,java.util.logging,Java.util.logging,我可以使用配置文件根据时间间隔刷新所有日志吗。搜索了很多。没有找到。捷径是自己使用定时器,冲洗所有的伐木工人。但是想知道ConfigurationOn file是否允许它。文档中解释了配置文件选项。此时,通过配置文件执行此操作的唯一方法是使用“config”选项安装自定义代码以刷新所有记录器并执行计时器管理。如果需要访问JVM生命周期,可以创建一个自定义处理程序,该处理程序忽略所有日志记录,但侦听构造函数并关闭方法调用 public class FlushAllHandler extends H

我可以使用配置文件根据时间间隔刷新所有日志吗。搜索了很多。没有找到。捷径是自己使用定时器,冲洗所有的伐木工人。但是想知道ConfigurationOn file是否允许它。

文档中解释了配置文件选项。此时,通过配置文件执行此操作的唯一方法是使用“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();
            }
        }
    }
}
公共类FlushAllHandler扩展处理程序{
专用最终计划执行器服务;
私人最终未来任务;
公共FlushAllHandler(){
//TODO:从日志管理器中查找这些。
super.setLevel(Level.OFF);//忽略所有已发布的记录。
ses=Executors.newScheduledThreadPool(1);
长延时=1L;
TimeUnit=TimeUnit.HOURS;
task=ses.scheduleWithFixedDelay(新任务(),延迟,延迟,单位);
}
@凌驾
公开作废发布(日志记录){
//允许触发过滤器启动冲洗。
if(isLoggable(记录)){
ses.execute(新任务());
}
}
@凌驾
公共图书馆{
}
@凌驾
public void close()引发SecurityException{
超级设置水平(水平关闭);
任务。取消(false);
ses.shutdown();
试一试{
等待终止(30,时间单位秒);
}捕获(中断异常例外){
Thread.currentThread().interrupt();
}
ses.shutdownow();
}
私有静态类任务实现可运行{
任务(){
}
@凌驾
公开募捐{
最终ArrayList处理程序=新ArrayList();
final LogManager=LogManager.getLogManager();
已同步(管理器){//避免ConcurrentModificationException
最终枚举e=manager.getLoggerNames();
而(e.hasMoreElements()){
final Logger l=manager.getLogger(e.nextElement());
如果(l!=null){
Collections.addAll(handlers,l.getHandlers());
}
}
}
//刷新处理程序时不要持有LogManager锁。
for(处理程序h:处理程序){
h、 冲洗();
}
}
}
}

我认为默认处理程序不支持它,因此您自己的实现是最好的。