1

我们正在将我们的应用程序从 WebSphere 迁移到 JBoss EAP 6.4。我在网上看到,从 JBoss EAP 6.x 开始,JBoss 使用自己的日志框架,称为 JBoss Logging,而不是之前的 log4j。

我们已经有一个用于应用程序特定日志的 log4j.properties 文件,它根据日志级别(log-error.log、log-info.log、...)将日志存储在单独的文件中,但实际上,它们也记录在控制台和 server.log 文件中。

一方面,我们希望应用程序日志仅使用我们现有的 log4j.properties 配置文件进行记录,但同时也阻止它们记录在 server.log 和控制台中。

另一方面,我们希望使用 JBoss Logging 框架记录服务器特定的日志,所以在 server.log 和控制台中。

总而言之,我们想从:

application logs + server logs => server.log/console + separate file logs

对此:

application logs => seperate file logs
server logs => server.log/console

有人知道如何实现这一目标吗?是否有人已经以类似的方式配置了 JBoss 服务器?

谢谢,

问候。

4

3 回答 3

2

不明白为什么,但 log4j 也会登录 stdout,因此 JBoss Logging 会捕获这些日志并将它们再次附加到 JBoss 控制台和 server.log,如下所示:

2017-08-08 15:14:20,304 INFO [stdout] <<My log4j log message>>.

通过将该代码添加到standalone.xml文件中,我暂时成功地防止了这种情况:

<logger category="stdout" use-parent-handlers="false">
    <level name="OFF"/>
</logger>

这不是一个坏习惯吗?

谢谢,

于 2017-08-08T15:13:42.590 回答
1

如果您在其中包含一个log4j.proeprties文件,WAR/WEB-INF/classes或者EAR/META-INF它应该可以正常工作。如果您在所有地方都看到特定于应用程序的日志记录,那么我的猜测是您在log4j.properties文件中配置了一个控制台附加程序。

于 2017-08-04T20:46:01.447 回答
1

我花了几天时间弄清楚这一点,我认为我有一些可行的方法。我正在使用 EAP 6.4。

首先,上面提到的关于将代码添加到standalone.xml的解决方案使下面描述的我的解决方案的输出在控制台中更容易阅读。如果您不执行该步骤,您会在控制台中获得一些额外的换行符。

我所做的是创建一个log4j.xml文件,但我没有调用log4j.xml。对于我的 2 个应用程序,我称之为servicelog4j.xml. 这意味着 JBoss 不会找到它。

然后,当我创建 log4j 记录器时,我执行以下操作(这是在我的类的静态方法中Log4jLogger):

public static Logger getLogger(Class aClass) {
    ClassLoader classLoader = Log4jLogger.class.getClassLoader();
    InputStream log4JStream = classLoader.getResourceAsStream("servicelog4j.xml");
    if (log4JStream != null) {
        new DOMConfigurator().doConfigure(log4JStream, LogManager.getLoggerRepository());
    }

    Logger log = Logger.getLogger(aClass);
    return log;
}

现在,该文件servicelog4j.xml位于我的 Eclipse 项目的资源文件夹中,因此在部署应用程序时,它将被复制到WEB-INF/classes/servicelog4j.xml.

该文件的内容是标准的 log4j 文件。我有一个标准文件附加程序和一个控制台附加程序。每个应用程序的文件附加程序指向不同的文件。

为了让我的类的调试代码出现在控制台(和文件中),我将以下内容放入servicelog4j.xml(因为我的所有代码都在包中com.mycompany.mypackage):

  <logger name="com.mycompany.mypackage">
      <level value="debug" />
      <appender-ref ref="CONSOLE" />
  </logger>
  <root>
      <priority value ="info" />
      <appender-ref ref="FILE" />
  </root>

通过上述配置,我在 Eclipse 控制台和文件中获得了所有消息。如果我只是删除该<logger>部分,那么调试消息将无处可去,这就是我在生产中想要的。

于 2018-07-03T22:41:24.147 回答