Tomcat服务器中的Log4j FileAppender问题

时间:2011-02-12 08:06:25

标签: java log4j tomcat6 logging

我正在开发一个web应用程序,我有一个需要在运行时为我的impex进程生成日志文件。这是用例 我正在验证一个XML文件,并且自定义错误处理程序正在处理验证错误。这个错误hanlde将被传递给底层验证器(Jaxb 2.x验证器),所以我必须在这个错误hanlder的实例时创建日志文件正在创建。 我们使用log4j作为日志API

这是在运行时创建日志文件的代码

XMLErrorHandler<Object> errorHandler=new XMLErrorHandler<Object>(logFileLocation);
        logFileName=errorHandler.getLogFileName();
        validator.setErrorHandler(errorHandler);
            validator.validate(source);

我在XMLErrorHandler构造函数中创建日志文件,因为这是我在这里控制的唯一一点是创建日志文件的代码

FileAppender appender;
            try {
                appender = new FileAppender(layout, sb.toString(), false);
                log.addAppender(appender);
                log.setAdditivity(false);
                log.setLevel(Level.WARN);
            } catch (IOException e) {
                e.printStackTrace();
            }

一切正常,文件正确创建,并由记录器写入相应的位置。 但是,如果我重新启动我的服务器,实际问题就会启动,并且记录器开始将日志内容不仅附加到其当前日志文件中,而且还附加了在服务器运行时为此过程创建的所有文件。这是细节 假设我已经在每个日志文件中有3行的位置有3个日志(A,B,C)文件,而C是该过程中创建的最新文件。  所以,当我重新启动我的服务器(通过resrarting我的意思是我从控制台停止tomcat)它有一些如何将数据附加到previos所有日志文件在这个fashin C还有3行 B现在有6条线 A现在有9行

似乎我创建的appender仍然是开放的或有参考,不确定究竟发生了什么。 这方面的任何帮助都会有所帮助。

3 个答案:

答案 0 :(得分:1)

问题解决了.. 问题是我正在使用的appender。我的印象是log4j自己处理appender的关闭但它没有这样做(我看到FileAppender代码,因为它试图关闭appender)。 所以我自己关闭了appender并解决了问题。

答案 1 :(得分:0)

需要更多信息。当你说“重新启动我的服务器”时,这是否意味着整个JVM重新启动或只是JVM中的线程?使用自定义守护程序之前我遇到了类似的问题。当我认为服务器重新启动时,它实际上并没有杀死守护进程和JVM的先前实例,所以我有多个实例在运行,更新和相互冲突。

答案 2 :(得分:0)

log.addAppender(appender);之前,您可以撰写log.removeAllAppenders();