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

Sal*_*gzi 4 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);
Run Code Online (Sandbox Code Playgroud)

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

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

这里有什么想法?

nde*_*rge 6

看看FileAppender.close()文档,它可能会解决您的问题.

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