【问题标题】:WebSphere, Log4j and SpringMVCWebSphere、Log4j 和 SpringMVC
【发布时间】:2013-10-26 16:32:49
【问题描述】:

当服务器启动时,我在控制台中看到所有正确的 log4j 配置。但是,我没有看到来自 spring 框架的任何日志消息。

另外,我添加了一些输出已定义记录器的代码,并且我看到我的 spring 记录器已定义。为什么我看不到 spring 的任何日志消息?

Enumeration loggers = Logger.getDefaultHierarchy().getCurrentLoggers();
while( loggers.hasMoreElements()){
    Logger logger = (Logger) loggers.nextElement();
    System.out.println(logger.getName()+","+logger.getLevel());
}

SystemOut     O org.springframework,DEBUG

我的 web.xml 是(log4j/spring 部分):

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/resource/log4j.xml</param-value>
</context-param>

 <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

我的 log4j.xml 是:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%5p %d %C{1} - %m%n" />
        </layout>
    </appender>

    <!-- Loggers to filter out various class paths -->
    <logger name="org.springframework" additivity="false">
        <level value="debug"/>
        <appender-ref ref="ConsoleAppender" />
    </logger>

</log4j:configuration>

这是我在控制台中看到的:

SystemOut     O log4j: System property is :null
SystemOut     O log4j: Standard DocumentBuilderFactory search succeded.
SystemOut     O log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
SystemOut     O log4j: debug attribute= "true".
SystemOut     O log4j: Threshold ="null".
SystemOut     O log4j: Retreiving an instance of org.apache.log4j.Logger.
SystemOut     O log4j: Setting [org.springframework] additivity to [false].
SystemOut     O log4j: Level value for org.springframework is  [debug].
SystemOut     O log4j: org.springframework level set to DEBUG
SystemOut     O log4j: Class name: [org.apache.log4j.ConsoleAppender]
SystemOut     O log4j: Setting property [target] to [System.Out].
SystemOut     O log4j: Setting property [threshold] to [DEBUG].
SystemOut     O log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
SystemOut     O log4j: Setting property [conversionPattern] to [%5p %d %C{1} - %m%n].
SystemOut     O log4j: Adding appender named [ConsoleAppender] to category [org.springframework].
SystemOut     O log4j: Level value for root is  [debug].
SystemOut     O log4j: root level set to DEBUG
SystemOut     O log4j: Adding appender named [ConsoleAppender] to category [root].

我尝试过的事情:

1) 来自this post 的已接受答案

2) 我删除了很多我认为可能会干扰 log4j 的 jar。

  • 我将 slf4j-jdk.jar 替换为 slf4j-log4j.jar

3) 在 web.xml 中添加 springs log4j 监听器(也尝试了 appcontext.xml 中的 log4jInitialization bean)

【问题讨论】:

    标签: spring-mvc log4j websphere-7


    【解决方案1】:

    尝试像这样将“Target”属性添加到您的控制台附加程序:

     <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="conversionPattern" value="%5p %d %C{1} - %m%n" />
            </layout>
        </appender>
    

    附:我的 log4j.xml(我在 JBoss 7 上使用它)文件中的示例:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration debug="true" xmlns:log4j='http://jakarta.apache.org/log4j/'>
    
        <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <param name="Threshold" value="debug"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
            </layout>
        </appender>
    
        <logger name="org.springframework" additivity="false">
            <level value="debug"/>
            <appender-ref ref="consoleAppender"/>
        </logger>
    
        <root>
            <level value="WARN"/>
            <appender-ref ref="consoleAppender"/>
        </root>
    
    </log4j:configuration>
    

    【讨论】:

      【解决方案2】:

      您需要指定根记录器。

      <root>
          <priority value="info"/>
          <appender-ref ref="ConsoleAppender"/>
      </root>
      

      另外,正如@Ernestas 所说,ConsoleAppender 需要Target 属性。

      【讨论】:

        【解决方案3】:

        原来丢失的部分是 jcl-over-slf4j.jar。一旦我让它工作起来,我就开始取消我所做的所有其他更改,看看哪些是不必要的。最终,这就是我必须做的:

        1. 添加:jcl-over-slf4j.jar、slf4j-log4j12.jar
        2. 删除:slf4j-jdk.jar(commons-logging.jar 没有干扰,所以 它留下了。)
        3. 添加 log4j.xml(见上文)

        web.xml 或 appcontext.xml 中的 log4j 特定配置被证明是不必要的 - 至少在我的情况下。

        我发现我的 lib 文件夹中有自己的 log4j.properties 文件的 jar 文件也没有干扰 - log4j interference - level keeps being set to "OFF"

        顺便说一句,以下帖子对识别这些文件非常有帮助 - List contents of multiple jar files

        【讨论】:

          【解决方案4】:

          我也遇到了同样的问题,我通过添加 commons-logging 的依赖来解决这个问题,如果这也适用于你,请尝试。下面是我在 pom.xml 中添加的依赖。

                 <dependency>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
                  <version>1.0.3</version>
                 </dependency>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多