Log4j 版本 2 不记录
Log4j version 2 not logging
我正在将我的应用程序的 log4j 更新到版本 2.17.1(它实际上不是我的,但它是我公司的项目,所以我必须遵循我公司的所有标准)。
为了配置 log4j,我们使用 log4j2.xml 存储在服务器文件系统上。
我的应用程序是 .ear EE 应用程序,其结构如下:
- 包含所有外部库的 libs 文件夹
- 包含应用程序描述符的 META-INF 文件夹
- myapp.jar 包含 ejb 模块
- myapp.web 包含网络应用描述符
我们通过代码传递位于应用程序服务器文件系统中的 log42.xml 文件的路径来配置 log4j2:
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 中编写的。当 servlet 启动时,它通过
之前显示的 java 代码加载 log4j2.xml
当我在 WebSphere 应用程序服务器中部署此应用程序时,所有记录器都可以工作。
当我将应用程序部署到 JBoss 应用程序服务器(版本 7.1)时出现问题:应用程序能够记录“/libs 下所有库的 类 中包含的所有内容" 文件夹,但它无法记录 myapp.jar 中包含的 类 的内容(如前所示)。
因此“com.mycomp.myapp”下的类不会记录任何内容,因为它们位于myapp.jar,而“com.mycomp.devicehandlers”下的类 、“com.mycomp.switchcommons”和“com.mycomp.basewebapp”可以记录所有内容,因为这些包存储在我的 .ear EE 应用程序的 /libs 文件夹下的库中(实际上库名称分别是 devicehandlers.jar、switchcommons.jar 和 basewebapp.jar。basewebapp.jar 包含使用之前显示的 java 代码初始化日志记录上下文的 servlet。
我尝试了所有可能的解决方案,但没有任何效果。我尝试以所有可能的方式更改 jboss-deployment-structure.xml。如果我尝试将记录器名称从“com.mycomp.myapp”更改为任何字符串,则没有区别。我无法更改 ear 应用程序的结构,因此库必须保留在 /libs 文件夹中,并且 myapp.jar 必须保留在原处。我尝试使用不同的方式来初始化 java 上下文,如下所示:
Configurator.initialize(servletContext.getServletContextName(), null, log4jConfFileName);
或者这个:
Configurator.initialize(null, log4jConfFileName);
这是 META-INFapplication.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”下的类登录JBoss7.1?有人遇到同样的问题吗?
我们已经解决了这个问题。问题是由 LogManager.getLogget log4j2 方法引起的。我们正在使用 log4j 1-2 桥接库和旧的 Logger.getLogger 方法。
我正在将我的应用程序的 log4j 更新到版本 2.17.1(它实际上不是我的,但它是我公司的项目,所以我必须遵循我公司的所有标准)。
为了配置 log4j,我们使用 log4j2.xml 存储在服务器文件系统上。
我的应用程序是 .ear EE 应用程序,其结构如下:
- 包含所有外部库的 libs 文件夹
- 包含应用程序描述符的 META-INF 文件夹
- myapp.jar 包含 ejb 模块
- myapp.web 包含网络应用描述符
我们通过代码传递位于应用程序服务器文件系统中的 log42.xml 文件的路径来配置 log4j2:
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 中编写的。当 servlet 启动时,它通过
之前显示的 java 代码加载 log4j2.xml当我在 WebSphere 应用程序服务器中部署此应用程序时,所有记录器都可以工作。
当我将应用程序部署到 JBoss 应用程序服务器(版本 7.1)时出现问题:应用程序能够记录“/libs 下所有库的 类 中包含的所有内容" 文件夹,但它无法记录 myapp.jar 中包含的 类 的内容(如前所示)。
因此“com.mycomp.myapp”下的类不会记录任何内容,因为它们位于myapp.jar,而“com.mycomp.devicehandlers”下的类 、“com.mycomp.switchcommons”和“com.mycomp.basewebapp”可以记录所有内容,因为这些包存储在我的 .ear EE 应用程序的 /libs 文件夹下的库中(实际上库名称分别是 devicehandlers.jar、switchcommons.jar 和 basewebapp.jar。basewebapp.jar 包含使用之前显示的 java 代码初始化日志记录上下文的 servlet。
我尝试了所有可能的解决方案,但没有任何效果。我尝试以所有可能的方式更改 jboss-deployment-structure.xml。如果我尝试将记录器名称从“com.mycomp.myapp”更改为任何字符串,则没有区别。我无法更改 ear 应用程序的结构,因此库必须保留在 /libs 文件夹中,并且 myapp.jar 必须保留在原处。我尝试使用不同的方式来初始化 java 上下文,如下所示:
Configurator.initialize(servletContext.getServletContextName(), null, log4jConfFileName);
或者这个:
Configurator.initialize(null, log4jConfFileName);
这是 META-INFapplication.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”下的类登录JBoss7.1?有人遇到同样的问题吗?
我们已经解决了这个问题。问题是由 LogManager.getLogget log4j2 方法引起的。我们正在使用 log4j 1-2 桥接库和旧的 Logger.getLogger 方法。