【问题标题】:Log4J configuration not displaying Spring Transaction and other logs in JBoss AS7Log4J 配置不显示 JBoss AS7 中的 Spring Transaction 和其他日志
【发布时间】:2012-05-09 12:08:00
【问题描述】:

以下是我的 log4j.properties:

log4j.rootLogger=ALL, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %p [%c] - %m%n


log4j.logger.org.springframework=ALL
log4j.logger.app.dev.ems=ALL
log4j.logger.org.springframework.transaction=ALL

我在 web.xml 中提到了log4jConfigLocation

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/resources/log4j.properties</param-value>
</context-param>

并且还定义了它的监听类:

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

但我无法在控制台中看到 Spring Transaction 日志。同样来自一个班级:app.dev.ems.web.wicket.page.home.HomePage 当我在做的时候:

Logger logger = LoggerFactory.getLogger(getClass());

public HomePage() {     
    logger.debug("<<<<<<<<<<<<<<<<<<<JYM>>>>>>>>>>>>>>>>>>");//if logger.info is used then it is showing.       
}

这也不显示该日志。我在 Wicket Application 中,我已经设置:

<init-param>
    <param-name>configuration</param-name>
    <param-value>DEVELOPMENT</param-value>
</init-param>

在定义 WicketServlet 时。

我无法找到问题所在。任何信息都会对我很有帮助。

注意:如果您希望我发布 applicationContext.xml,我可以这样做。事务是注释驱动的。


我添加了 log4j-1.2.14、slf4j-api-1.6.1、slf4j-log4j12-1.4.2。我正在使用 JBoss AS-7.1.0-Final。

在其他 SO 线程中,我看到这是 JBoss 的问题,根据那里给出的指令,我在 WEB-INF 中添加了 jboss-deployment-structure.xml(也尝试使用 META-INF):

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.apache.log4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure> 

并在 applicationContext.xml 中定义了一个 bean,它将加载 log4j.properties:

<bean id="log4jInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
    <property name="targetMethod" value="initLogging" />
    <property name="arguments">
        <list>
            <value>classpath:/app/dev/ems/web/log4j.properties</value>
        </list>
    </property>
</bean>

但不幸的是,它没有奏效。

【问题讨论】:

  • 您是在独立模式还是域模式下运行? JBoss 现在默认为 sl4j。您是否还在standalone.xml 或domain.xml 的日志子系统中添加了记录器?
  • @CoolBeans 我没有添加任何东西。我刚刚下载了 JBoss-AS-7.1.0-Final 并将我的战争部署到了独立/部署文件夹中。我在其他一些 SO 线程中看到使用 jboss-deployment-structure.xml,所以我遵循了。我修改了我的问题来描述这些步骤。
  • Spring 使用 common-logging 所以你必须先禁用它。阅读Logging section of Spring Reference Mannual
  • @Cole 排除 common-logging 后是否需要采取 jboss-deployment-structure.xml 之类的步骤?
  • @TapasBose 我不熟悉JBoss的配置,所以你必须自己尝试一下。反正我的项目在jetty下使用slf4j+logback,按照spring参考指令,成功看到spring日志。

标签: java logging log4j jboss7.x spring-transactions


【解决方案1】:

使用jboss-deployment-structure.xml 排除应该可以工作。如果不是,它可能是您的配置文件的位置。我对 Spring 不熟悉,所以添加 &lt;context-param/&gt; 可能是指定日志配置位置的典型方法。

您可能想尝试将您的 log4j.properties 移动到存档的 WEB-INF/classesMETA-INF 目录。此外,您还要确保在部署中包含 log4j 库。

FWIW 将不再需要 jboss-deployment-structure.xml 进行日志记录配置。它还没有发布,但它在上游源中。

由于您似乎正在寻找一种打开调试的方法,因此您需要做两件事。您需要设置一个处理程序以允许调试消息通过。您还需要设置一个记录器,该记录器至少允许调试(如果不是所有消息)。

例如,在您的情况下,您会像这样创建一个记录器。

<logger category="app.dev.ems.web.wicket" />

这将创建一个记录所有级别的记录器。现在创建一个处理程序,或更改以前定义的处理程序以接受调试消息。

另一个例子是为您的特定记录器创建一个文件处理程序,它将您的日志消息打印到一个文件中。

<file-handler name="myFileHandler>
    <level name="DEBUG"/>
    <file relative-to="jboss.server.log.dir" path="my-log.log"/>
</file-handler>

现在创建您的记录器并将处理程序分配给它。

<logger category="app.dev.ems.web.wicket">
    <handlers>
        <handler name="myFileHandler/>
    </handlers>
<logger>

现在,除了附加到根记录器的处理程序之外,所有通过具有app.dev.ems.web.wicket.* 类别的记录器的日志消息都将打印到该文件。如果您不想在默认的server.log 或控制台上看到这些,可以将use-parent-handler="false" 属性添加到记录器。

【讨论】:

    【解决方案2】:

    我找到了解决办法。我的目的是查看事务日志。现在我可以看到了。我所做的,我修改了standalone.xml 文件驻留在standalone/configuration 中。我更改了 Logging 子系统的某些部分:

    控制台处理程序:

    <console-handler name="CONSOLE">
       <level name="INFO"/>
       <formatter>
           <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
       </formatter>
     </console-handler>
    

    改为

    <console-handler name="CONSOLE">
       <level name="DEBUG"/>
       <formatter>
           <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
       </formatter>
     </console-handler>
    

    还有根记录器

    <root-logger>
       <level name="INFO"/>
       <handlers>
          <handler name="CONSOLE"/>
          <handler name="FILE"/>
       </handlers>
    </root-logger>
    

    改为

    <root-logger>
       <level name="DEBUG"/>
       <handlers>
          <handler name="CONSOLE"/>
          <handler name="FILE"/>
       </handlers>
    </root-logger>
    

    这行得通。现在我可以在控制台中看到 DEBUG 登录。 :)

    【讨论】:

    • 啊,您只想打开调试日志记录?这在您原来的问题中不是很清楚:-) 您可以从控制台处理程序中删除级别。此外,如果您要创建特定的记录器,例如&lt;logger category="app.dev.ems.web.wicket"&gt;&lt;level name="DEBUG"/&gt;&lt;/logger&gt;,那么您就不必将根记录器设置为调试级别。
    • 谢谢。我主要想要的是查看事务日志。然后我发现了那个简单的 log.debug("something");不显示,但 log.info("something");做。现在问题解决了。您可以在答案中添加此特定评论吗?再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2018-12-07
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多