Log4j 版本 2 不记录

Log4j version 2 not logging

我正在将我的应用程序的 log4j 更新到版本 2.17.1(它实际上不是我的,但它是我公司的项目,所以我必须遵循我公司的所有标准)。

为了配置 log4j,我们使用 log4j2.xml 存储在服务器文件系统上。

我的应用程序是 .ear EE 应用程序,其结构如下:

我们通过代码传递位于应用程序服务器文件系统中的 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 方法。