1

我在各种环境中都遇到过这种情况,但从未找到一致的解释。我听说过关于 Tomcat 容器“混乱”的评论,其中可能有不同的日志记录实现,然后我的应用程序或类加载器不知道要使用哪种配置。

这是日志记录工作一次,然后在一个小时后没有记录,log4j.xml 文件没有更改时的那些令人抓狂的场景之一。我的 log4j.xml 文件位于 /src 目录的根目录中,因此它被部署到 /WEB-INF/classes 目录的根目录。我正在使用 Java 6、Tomcat 6,它是一个 GWT 2.3 应用程序,在 Windows 7 机器上的 Eclipse Helios 内部运行。

对于它的价值,这里是 log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE}
      %5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${catalina.home}/logs/log4j.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d
                %-5p  [%c{1}] %m %n" />
        </layout>
    </appender>
    <root>
        <priority value="debug"></priority>
        <appender-ref ref="fileAppender"/>
    </root>
</log4j:configuration>

这是我在课堂上获取记录器的方法

protected static Logger m_logger = Logger.getLogger(RemoteLoggingServiceImpl.class);

然后实际登录我只是做

m_logger.debug("my log message");

使用上面的代码,它不会写入 logj4.log 文件。

然后我尝试了以下操作,将其记录到 log4j.log 文件,但没有像我预期的那样记录到 otherFile.log 文件。这是更新的 log4j.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE}
      %5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${catalina.home}/logs/log4j.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d
                %-5p  [%c{1}] %m %n" />
        </layout>
    </appender>
    <appender name="otherFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${catalina.home}/logs/otherFile.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d
                %-5p  [%c{1}] %m %n" />
        </layout>
    </appender>
    <root>
        <priority value="debug"></priority>
        <appender-ref ref="fileAppender"/>
    </root>
    <logger name="com.mypackage.myLoggingClass">
        <level value="debug"/>
        <appender-ref ref="otherfileAppender"/>
    </logger>
</log4j:configuration>

我用这个来创建这个记录器:

protected static Logger m_logger = Logger.getLogger("com.mypackage.myLoggingClass");

谁能解释为什么它在第一种情况下根本不记录,和/或为什么在第二种情况下它记录到 log4j.log 而不是 otherFile.log?

4

3 回答 3

1

首先,您没有列出您使用的 Log4j 版本,所以我假设您使用的是相对较新的 Log4j 版本。

在您提供的第一个示例代码块中:

    <root>
        <priority value="debug"></priority>
        <appender-ref ref="fileAppender"/>
    </root>

您尚未修改根附加程序的日志记录级别。根据 log4j 2.x 文档

    如果不存在配置文件,则 logback 将默认为
    DefaultConfiguration 将设置一个最小的日志记录环境
    由附加到根记录器的 ConsoleAppender 组成。输出
    将使用设置为模式的 PatternLayout 进行格式化
    “%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n”。

    请注意,默认情况下,根记录器分配给 Level.ERROR。

为了将记录器输出到第一个示例中的文件,您需要将根记录器更改为:

    <root level="debug">
        <appender-ref ref="fileAppender"/>
    </root>    

调试日志不起作用的一个很好的指标是,由于默认日志级别设置为“错误”,因此您也不会在控制台上看到任何输出。我总是喜欢在我的记录器上有一个控制台附加程序,这样我就可以看到我的应用程序实际上正在记录。

    <appender-ref ref="Console"/>

在第二个示例中,根记录器不会记录到文件中,原因与第一个示例完全相同。但是,您设法正确设置了“com.mypackage.myLoggingClass”记录器,这就是当您使用基于“com.mypackage.myLoggingClass”类的记录器时您的应用程序具有调试输出的原因。

于 2012-12-14T01:08:01.147 回答
0

据我所知,您的所有原始假设都是正确的,并且应该打印日志,所以在这种情况下我要检查一些事情:

  • 检查您的类路径,您是否导入了其他导致冲突的日志库 jar(slf4j、common-logging 等)?
  • 检查您的导入,它真的是 org.apache.log4j.*,而不是其他日志库
  • 检查gwt logging guide,它是否与 log4j 冲突?
  • 检查 log4j.log 上的文件系统锁定,是否有任何其他进程锁定它导致写入失败?
  • 检查你的war/ear 文件,log4j.xml 真的放在WEB-INF/classes 上吗?
  • 检查 ${catalina.home} 确实解析到您想要的路径
于 2012-12-14T00:26:33.653 回答
0

您的 JRE 使用一个名为的文件logging.properties来设置处理程序和日志级别以及一些其他设置,以便在所有 Java 命令之间全局共享。
很多时候它看到默认是,您可以尝试像下面这样handlers= java.util.logging.ConsoleHandler附加。java.util.logging.FileHandler

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

还尝试将文件格式化程序设置为 SimpleFormatter 而不是 XML 格式化程序

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
于 2016-02-18T04:51:12.837 回答