7

这个项目是传给我的,所以不太了解。有一种使用日志(java.util.logging.Logger)的方法,它会创建两个日志文件:

第一个文件:fileName.log

第二个文件:fileName.log.lck

在 Linux 中,当我这样做时lsof,我看到这两个文件是打开的。如何关闭这两个文件?

我要关闭这些文件的原因是这种方法每天运行多次,几周后打开文件的数量达到限制(大约 1000 个),此时我们的系统停止工作。当我们重新启动我们的进程(执行日志记录的“作业控制器”)时,打开的日志文件数变为 0,并且它再次工作。

这就是日志记录所做的工作

private static Logger log = Logger.getLogger(MyClass.class.getPackage().getName());
try{
    log.logp(Level.SEVERE, "com.MyClass", "run", "It failed");
}

这是我试图关闭 finally 块中的文件但它没有用

finally{
    Handler[] handler =   log.getHandlers();
    for(Handler h: handler){
        h.close();
    }
}
4

2 回答 2

9

我只是使用:

LogManager.getLogManager().reset();

这将取消您的所有日志设置(日志文件路径、文件名模式、格式化程序...),但它将停止使用记录器关闭锁定文件并将记录器释放到

于 2014-04-09T08:34:59.690 回答
2

第一个解决方案

如果您不想修改代码,请使用:如何将 java.util.logging 发送到 log4j? java.util.logging.Logger 到使用 SLF4J 的 Logback?

我使用log4jlogback。两者都有滚动文件附加器(旧文件被删除)或日期/时间文件附加器。

第二种解决方案

对于记录,最好的用法是滚动文件。

String filePattern = " fileName%.log";
int limit = 1000 * 1000; // 1 Mb
int numLogFiles = 3;
FileHandler fh = new FileHandler(filePattern, limit, numLogFiles);

// Add to logger
Logger logger = Logger.getLogger(MyClass.class.getPackage().getName());
logger.addHandler(fh);

我不知道您是否可以添加全局文件处理程序。

于 2012-10-12T06:59:43.637 回答