如何用JBoss日志记录和特定于log4j的应用程序特定日志分别记录JBoss服务器特定日志?

时间:2017-08-04 16:09:33

标签: java jboss slf4j jboss-eap-6 jboss-logging

我们正在努力将我们的应用程序从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和console中登录。

另一方面,我们希望使用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服务器?

谢谢你,

问候。

3 个答案:

答案 0 :(得分: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>

这不是一种不好的做法吗?

谢谢,

答案 1 :(得分:1)

如果您在log4j.proeprtiesWAR/WEB-INF/classes中添加了EAR/META-INF个文件,那么它应该可以正常运行。如果您在所有地方都看到了特定于应用程序的日志记录,那么我的猜测就是您在log4j.properties文件中配置了控制台appender。

答案 2 :(得分: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项目的resources文件夹中,因此在部署应用程序时,它将被复制到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>部分,那么调试消息将无处可寻,这是我在生产中想要的。