1

我想在我的 JBoss 6.1 部署中使用 log4j 附加程序。由于我无法让它工作,我编写了一些测试代码并注意到 org.apache.log4j.Logger.getLogger(String) 正在返回一个 org.jboss.logmanager.log4j.BridgeLogger 类型的对象。

所以我想我有两个选择:(1)尝试让 getLogger 调用返回一个 apache log4j 类型而不是 JBoss BridgeLogger,或者(2)接受 JBoss 正在做某种桥接并让它使用 log4j appenders我已经写了我需要它来使用。

所以尝试第一个选项:Logger.getLogger() 委托给 LogManager.getLogger(String),它执行以下操作:

return getLoggerRepository().getLogger(String);

RepositorySelector 在 LogManager 中是静态的,设置如下:

Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
repositorySelector = new DefaultRepositorySelector(h);

但是LogManager有一个setRepositorySelector,所以我得出的结论是JBoss启动过程中有东西在调用setRepositorySelector。因此,为了测试我从我的测试日志代码中调用了 setRepositorySelector(将其设置为 DefaultRepositorySelector 作为 LogManager 的静态初始化程序),然后检查返回的 Logger 类型 - 它仍然是 org.jboss.logmanager.log4j 类型。桥梁记录器!!

所以现在继续我的第二个选项:我想要的只是能够使用 log4j 附加程序 - deploy/jboss-logging.xml 文件有很多注释掉的 log4j 附加程序,所以我猜它们必须得到支持。因此,我按如下方式放入:

<log4j-appender name="MYTEMPFILE" class="org.apache.log4j.RollingFileAppender">
    <error-manager>
        <only-once/>
    </error-manager>

    <level name="DEBUG"/>

    <properties>
        <property name="file">${jboss.server.home.dir}/log/serverx.log</property>
        <property name="maximumFileSize">20480000</property>
        <property name="maxBackupIndex">5</property>
    </properties>

    <formatter>
        <pattern-formatter pattern="%d %-5p [%c] (%t) %m%n"/>
    </formatter>

</log4j-appender>
<!-- tried this too
<logger category="com.myco">
   <level name="DEBUG"/>
   <handlers>
      <handler-ref name="MYTEMPFILE"/>
   </handlers>
</logger>
-->
...
<root-logger>
    <!-- Set the root logger priority via a system property, with a default value. -->
    <level name="${jboss.server.log.threshold:DEBUG}"/>
    <handlers>
        <handler-ref name="MYTEMPFILE"/>
        <handler-ref name="CONSOLE"/>
        <handler-ref name="FILE"/>
    </handlers>
</root-logger>

通过该更改,我不仅没有得到我的 serverx.log 文件,而且没有任何写入 server.log 的内容(没有上述更改的情况下填充了 server.log)。

我已经阅读了很多关于 jboss-deployment-structure.xml 并排除 log4j 依赖项的内容,但我对正在讨论的内容了解不够,无法知道它是否与我的问题相关。我怀疑这无关紧要。

我什至尝试部署这个听起来相关的补丁: https ://issues.jboss.org/browse/JBAS-8791 但没有区别。

任何人?

谢谢,保罗

4

1 回答 1

1

为了在您的应用程序的 log4j.jar 没有保存在 EAR 或 WAR 中的情况下使用您自己的 log4j.xml,您必须执行以下操作。

  1. 设置环境变量:-Dlog4j.configuration=log4j.xml
  2. 您必须在<jboss_home>\server\default\deployers\jboss-logging.deployer\META-INF\logmanager-jboss-beans.xml.

    <bean name="JBossLog4jRepositorySelector" class="org.jboss.logmanager.log4j.BridgeRepositorySelector" />

希望这对你有用

于 2015-07-27T11:58:55.113 回答