Jboss EAP 6.4 - 配置 slf4j-log4j12

Jboss EAP 6.4 - configure slf4j-log4j12

我的 war 上有以下 pom.xml

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>          
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <scope>provided</scope>
</dependency>       

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>          
    <scope>provided</scope>
</dependency>

我的log4j.properties如下:

# Direct log messages to 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{ABSOLUTE} %5p %c{1}:%L - %m%n

# Root logger option
log4j.rootLogger=DEBUG, stdout

# Hibernate logging options (INFO only shows startup messages)
log4j.logger.org.hibernate=INFO

# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=TRACE

问题是当我将 log4j.properties 放在 src/main/resources 中时,它不会在控制台上打印任何内容。 如果我从上面的目录中删除 log4j.properties,它会打印 info log.

怎么回事?

EAP 6 有自己的日志子系统,称为 JBoss LogManager,"encourages" 您可以通过为 log4j slf4j 和更多日志框架提供模拟 .jar 来使用它。这些模拟 .jars 将在运行时位于您的类路径中。他们基本上将所有日志消息转发到 JBoss LogManager,该管理器在 standalone.xml.

的日志子系统中配置

我真的很喜欢这种方法,因为它将所有日志记录配置统一在一个地方。顺便打包 log4j.properties 可能会消除在运行时更改日志记录配置的选项。

如果您仍然想使用真正的 log4j,则需要做一些工作:

  • 通过 jboss-deployment-structure.xml
  • 排除 "fake" slf4j 和 log4j
  • 改为打包真正的实现(只需将 Maven 范围从提供更改为编译)
  • 阻止 JBoss LogManager 通过设置系统修改您的部署 属性 org.jboss.as.logging.per-deployment=false

编辑:jboss-部署-structure.xml 可能如下所示:

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.apache.log4j" />
      <module name="org.slf4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

如果你有耳朵,你可能还必须为每个子部署排除这些。