1
구성 파일을 사용하여 시간 간격에 따라 모든 로그를 비울 수 있습니까? 많이 검색했습니다. 아무것도 찾지 못했습니다. 지름길은 Timer를 사용하고 모든 로거를 플러시합니다. 그러나 구성 파일이 허용하는지 여부를 알고 싶었습니다.정기적 인 자바 로깅
구성 파일을 사용하여 시간 간격에 따라 모든 로그를 비울 수 있습니까? 많이 검색했습니다. 아무것도 찾지 못했습니다. 지름길은 Timer를 사용하고 모든 로거를 플러시합니다. 그러나 구성 파일이 허용하는지 여부를 알고 싶었습니다.정기적 인 자바 로깅
구성 파일 옵션은 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();
}
}
}
}
기본 처리기가 지원하지 않는다고 생각합니다. 따라서 구현 자체가 최선입니다. – centic