1
我可以使用配置文件基于时间间隔刷新所有日志。搜索了很多。没有找到任何。快捷方式是自己使用Timer,并刷新所有记录器。但想知道配置文件是否允许。定期java日志
我可以使用配置文件基于时间间隔刷新所有日志。搜索了很多。没有找到任何。快捷方式是自己使用Timer,并刷新所有记录器。但想知道配置文件是否允许。定期java日志
配置文件选项在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 2012-08-28 12:18:57