Log4j 2 不在 Spring 2.5 Tomcat 应用程序中写入日志
Log4j 2 not writing logs within a Spring 2.5 Tomcat app
我取出了一个基于 Spring 2.5 和 Log4j 1.2 的旧项目,并开始将其升级到现在的库依赖项。
更新Spring 很费时间,所以我从其他库开始,从 Log4j 1.2 更改为 Log4j 2。
我已经使用 maven enforcer 插件解决了所有依赖问题!
我的 Maven 依赖项现在看起来像这样:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.11.2</version>
</dependency>
在我的(旧)web.xml 中仍然配置了以下内容:
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
所以我假设一切都应该工作,因为向后兼容。但是在我的 Tomcat 的日志文件中只出现以下内容:
04-Apr-2019 12:45:05.035 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing log4j from [classpath:log4j.properties]
04-Apr-2019 12:45:05.068 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
04-Apr-2019 12:45:17.661 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'test'
然后仅此而已......应该有成千上万的日志条目......
我已经搜索了所有 tomcat 日志文件但没有成功 - 没有例外,也没有其他任何东西给我提示为什么我的代码不会 运行 使用 Log4j2 - 任何提示?
恢复到 log4j 1.2 时一切正常。
请将答案视为对所述情况进行故障排除的尝试。
答案是 "common" 因为这里可能出错的地方太多了,不知道代码和配置就很难分辨,并且反映了我将如何处理这个任务
将 log4j 1.x 迁移到 log4j 2.x 并不像切换 jars 那样容易。
因此,首先,确保您理解(并在您的代码库中应用)这个 migration guide 应该更改一些导入。
然后我认为你应该确保 log4j 1.x 不会传播到你的应用程序的工件中(一个可能的原因是它被定义为传递依赖)
为了跟踪这个,运行 mvn dependency:tree
如果没有 log4j 1.x 罐子 - 它很好。
现在,有时(例如 Spring 本身),库,可能还有您自己的代码不直接使用 log4j 记录器,而是使用 slf4j。
在这种情况下,您需要将 slf4j 绑定到 log4j2:https://logging.apache.org/log4j/2.0/log4j-slf4j-impl/
然后就可以开始检查配置了。
最好的方法是调试你的应用程序,它在代码中的某处有类似的东西:
logger.info("Some message");
在那里放置一个断点并检查你有什么样的记录器以及真正分配给它的附加程序是什么,也许桥不工作并且 运行time 中的应用程序有一个空操作实现或者,如果它是一个真正的实现,也许附加程序没有正确分配并且消息无处可去。
最后很简单:
我从 mvnrepository.com 复制了依赖项(api,核心),因此它们包含:
<scope>test</scope>
必须删除 - 在此之后我还必须修复最后一个依赖性问题 - 然后日志记录又回来了。
最后但并非最不重要的一点是,属性的 log4j 转换器似乎并不完整,因此我并行添加了一个 log4j2.properties 以获得 rollingAppender 的结果。
我取出了一个基于 Spring 2.5 和 Log4j 1.2 的旧项目,并开始将其升级到现在的库依赖项。
更新Spring 很费时间,所以我从其他库开始,从 Log4j 1.2 更改为 Log4j 2。
我已经使用 maven enforcer 插件解决了所有依赖问题!
我的 Maven 依赖项现在看起来像这样:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.11.2</version>
</dependency>
在我的(旧)web.xml 中仍然配置了以下内容:
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
所以我假设一切都应该工作,因为向后兼容。但是在我的 Tomcat 的日志文件中只出现以下内容:
04-Apr-2019 12:45:05.035 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing log4j from [classpath:log4j.properties]
04-Apr-2019 12:45:05.068 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
04-Apr-2019 12:45:17.661 INFORMATION [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'test'
然后仅此而已......应该有成千上万的日志条目......
我已经搜索了所有 tomcat 日志文件但没有成功 - 没有例外,也没有其他任何东西给我提示为什么我的代码不会 运行 使用 Log4j2 - 任何提示?
恢复到 log4j 1.2 时一切正常。
请将答案视为对所述情况进行故障排除的尝试。 答案是 "common" 因为这里可能出错的地方太多了,不知道代码和配置就很难分辨,并且反映了我将如何处理这个任务
将 log4j 1.x 迁移到 log4j 2.x 并不像切换 jars 那样容易。 因此,首先,确保您理解(并在您的代码库中应用)这个 migration guide 应该更改一些导入。
然后我认为你应该确保 log4j 1.x 不会传播到你的应用程序的工件中(一个可能的原因是它被定义为传递依赖)
为了跟踪这个,运行 mvn dependency:tree
如果没有 log4j 1.x 罐子 - 它很好。
现在,有时(例如 Spring 本身),库,可能还有您自己的代码不直接使用 log4j 记录器,而是使用 slf4j。 在这种情况下,您需要将 slf4j 绑定到 log4j2:https://logging.apache.org/log4j/2.0/log4j-slf4j-impl/
然后就可以开始检查配置了。 最好的方法是调试你的应用程序,它在代码中的某处有类似的东西:
logger.info("Some message");
在那里放置一个断点并检查你有什么样的记录器以及真正分配给它的附加程序是什么,也许桥不工作并且 运行time 中的应用程序有一个空操作实现或者,如果它是一个真正的实现,也许附加程序没有正确分配并且消息无处可去。
最后很简单:
我从 mvnrepository.com 复制了依赖项(api,核心),因此它们包含:
<scope>test</scope>
必须删除 - 在此之后我还必须修复最后一个依赖性问题 - 然后日志记录又回来了。
最后但并非最不重要的一点是,属性的 log4j 转换器似乎并不完整,因此我并行添加了一个 log4j2.properties 以获得 rollingAppender 的结果。