我正在为我的应用程序将log4j更新到2.17.1版本(它实际上不是我的,但它是为我公司的项目,所以我必须遵循我公司的所有标准)。
要配置log4j,我们使用存储在服务器文件系统上的log4j2.xml。
我的应用程序是.ear EE应用程序,其结构如下:
- libs文件夹包含所有外部库
- 包含应用程序描述符的META-INF文件夹
- 包含ejb模块的myapp.jar
- myapp.web包含Web应用程序描述符
我们通过代码传递位于应用服务器文件系统中的log42.xml文件的路径来配置log4j 2:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
context.setConfigLocation(new File(log4jConfFileName).toURI()); //the path where log42.xml is stored in app server file system
context.updateLoggers();
这是log4j2.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
<Appenders>
<RollingFile name="main_file_appender"
filePattern="${sys:logfile.path}/myapp/myapp.%d{yyyy-MM-dd-HH}.log">
<PatternLayout
pattern="%d{DEFAULT} - %-5level [%c{1}] %X{clientId}- %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="off" />
<Logger name="com.mycomp.myapp" level="debug">
<AppenderRef ref="main_file_appender" />
</Logger>
<Logger name="com.mycomp.devicehandlers" level="debug">
<AppenderRef ref="main_file_appender" />
</Logger>
<Logger name="com.mycomp.switchcommons" level="trace">
<AppenderRef ref="main_file_appender" />
</Logger>
<Logger name="com.mycomp.basewebapp" level="debug">
<AppenderRef ref="main_file_appender" />
</Logger>
</Loggers>
</Configuration>
前面显示的那行java代码是在我的应用程序的/libs文件夹下的一个库中存储的servlet中编写的。
当我在WebSphereApplicationServer中部署这个应用程序时,所有的记录器都工作了。
当我将应用程序部署到JBoss应用服务器(版本7.1)中时,出现此问题:应用程序能够记录“/libs”文件夹下所有库的类中包含的所有内容,但不能记录myapp.jar中包含的类的内容(如前所示)。
因此,“com.mycomp.myapp”下的类不记录任何内容,因为它们位于myapp.jar中,而“com.mycomp. devicedhandlers”、“com.mycomp.switchcommons”和“com.mycomp.basewebapp”下的类可以记录所有内容,因为这些包存储在我的.ear EE应用程序的/libs文件夹下的库中(实际上,库名称分别为devicehandlers.jar、switchcommons.jar和basewebapp.jar。basewebapp.jar包含使用前面所示的Java代码初始化日志上下文的servlet)。
我尝试了所有可能的解决办法,但是没有任何效果。我尝试用所有可能的方法更改jboss-deployment-structure.xml。如果我尝试将logger名称从“com.mycomp.myapp”更改为任何字符串,也没有任何区别。我不能更改ear应用程序的结构,因此libs必须位于/libs文件夹中,myapp.jar必须位于其所在的位置。我尝试使用不同的方法来初始化java上下文,如下所示:
Configurator.initialize(servletContext.getServletContextName(), null, log4jConfFileName);
或以下内容:
Configurator.initialize(null, log4jConfFileName);
这是META-INF下的application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
<display-name>myapp 1.23.5-RC</display-name>
<module>
<web>
<web-uri>myapp.war</web-uri>
<context-root>/myapp</context-root>
</web>
</module>
<module>
<ejb>myapp.jar</ejb>
</module>
<library-directory>libs</library-directory>
</application>
我怎样才能让“com.mycomp.myapp”下的类登录JBoss 7.1?有人遇到过同样的问题吗?
1条答案
按热度按时间e5nszbig1#
我们已经修复了这个问题。这个问题是由LogManager.getLogget log4j 2方法引起的。我们使用的是log4j 1-2桥接库和旧的Logger.getLogger方法。