【问题标题】:Log4j FileAppender issue in Tomcat serverTomcat 服务器中的 Log4j FileAppender 问题
【发布时间】:2011-02-12 08:06:24
【问题描述】:

我正在开发一个 web 应用程序,我需要在运行时为我的 impex 进程生成日志文件。这是用例 我正在验证一个 XML 文件,并且自定义错误处理程序正在处理验证错误。此错误处理程序将传递给底层验证程序(Jaxb 2.x 验证程序),因此我必须在此错误处理程序的实例时创建日志文件正在创建。 我们使用 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 个日志(A、B、C)文件,每个日志文件中有 3 行,C 是该过程中创建的最新文件。 所以当我重新启动我的服务器时(通过重新启动我的意思是我从控制台停止了tomcat)它是如何将数据附加到这个fashin中的所有日志文件的 C还有3行 B 现在有 6 行 A 现在有 9 行

似乎我创建的附加程序仍然打开或有引用,不确定到底发生了什么。 这方面的任何帮助都会有所帮助。

【问题讨论】:

    标签: java log4j tomcat6 logging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 通过重新启动我的服务器,我的意思是因为事情正在开发中,所以我只是从 Eclipse 中停止我的服务器(Tomcat)而不是再次启动它。当我从 Eclipse 中停止我的服务器时发生上述行为。我注意到的是,当服务器运行时,它不会在所有文件中附加内容,当我停止服务器时会发生这种行为。
      【解决方案3】:

      log.addAppender(appender);之前你可以写log.removeAllAppenders();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2014-03-06
        • 1970-01-01
        相关资源
        最近更新 更多