2012-07-26 4 views
1

구성 파일을 사용하여 시간 간격에 따라 모든 로그를 비울 수 있습니까? 많이 검색했습니다. 아무것도 찾지 못했습니다. 지름길은 Timer를 사용하고 모든 로거를 플러시합니다. 그러나 구성 파일이 허용하는지 여부를 알고 싶었습니다.정기적 인 자바 로깅

+0

기본 처리기가 지원하지 않는다고 생각합니다. 따라서 구현 자체가 최선입니다. – centic

답변

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(); 
      } 
     } 
    } 
} 
관련 문제