关闭log4j日志记录器以释放文件描述符。

4
我编写了一个服务器来接收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个回答

6
请查看FileAppender.close()的文档,也许它可以解决你的问题。但我认为你应该重新考虑你的设计,只使用一个Logger实例,对吧?

谢谢。我现在正在看这个。感觉很傻,错过了一个如此明显的东西。我创建每个请求的不同记录器实例的原因是为了拥有单独请求的不同日志文件。当我想要调试失败的特定请求时,这会使事情变得更容易。 - Salman A. Kagzi

1

将你的日志记录器设为final static应该可以解决问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接