关闭log4j Logger以释放文件描述符

时间:2012-03-09 09:42:05

标签: java logging log4j

我编写了一个接收RMI请求并执行某些操作的服务器。

为每个请求创建一个Log4J Logger实例。以下是用于创建Logger实例的代码片段。

Logger log = Logger.getLogger("log_" + requestID);
log.setAdditivity(false);
FileAppender appender = null;
try {
    PatternLayout layout = new PatternLayout("%-5p %C{1} %d{yyyy-MM-dd HH:mm:ss} : %m%n");
    appender = new FileAppender(layout, logFileName, false);
} catch(Exception e) {
    logger.error("Error initializing logger", e);
}

log.addAppender(appender);
log.setLevel(level);

这里的事情很好。收到大量请求后,问题就是超时,此服务器进程的打开文件数量增加而且没有降低,从而导致进程崩溃,并显示打开文件太多的例外情况。

进一步检查后发现问题是因为在请求完成后文件描述符没有被释放。我试过查看Log4J文档但是找不到任何关于如何关闭一个记录器而不影响可能在不同线程中运行的其他记录器的内容。

这里有什么想法吗?

2 个答案:

答案 0 :(得分:6)

看看FileAppender.close() documentation,也许它会解决您的问题。

但我认为您应该重新考虑您的设计,并且只有一个Logger实例,不是吗?

答案 1 :(得分:1)

让你的记录器最终静止应该解决问题:

private final static Logger logger = Logger.getLogger(YOURCLASS.class);