[英]How to separately logging JBoss server specific logs with JBoss Logging and application specific logs with log4j?
我们正在努力将应用程序从WebSphere迁移到JBoss EAP 6.4。 我在Internet上读到,自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服务器?
谢谢,
问候。
不知道为什么,但是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>
这不是一个坏习惯吗?
谢谢,
如果在WAR/WEB-INF/classes
或EAR/META-INF
包含log4j.proeprties
文件,则它应该可以正常工作。 如果在所有地方都看到特定于应用程序的日志记录,那么我猜想是您在log4j.properties
文件中配置了控制台附加程序。
我花了几天的时间解决这个问题,我认为我有一些可行的方法。 我正在使用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>
部分,则调试消息将无处可寻,这是我在生产中想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.