2012-07-26 58 views
1

我可以使用配置文件基于时间间隔刷新所有日志。搜索了很多。没有找到任何。快捷方式是自己使用Timer,并刷新所有记录器。但想知道配置文件是否允许。定期java日志

+0

我不认为默认处理程序支持它,所以你自己的实现是你可以做的最好的。 – centic 2012-08-28 12:18:57

回答

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(); 
      } 
     } 
    } 
}