繁体   English   中英

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 执行器插件修复了所有依赖问题!

我的 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 时,一切都按预期工作。

最后很简单:

我已经从 mvnrepository.com 复制了依赖项(api、core),以便它们包含:

<scope>test</scope>

必须删除它 - 在此之后我还必须解决最后一个依赖问题 - 然后日志记录又回来了。

最后但并非最不重要的一点是,属性的​​ log4j 转换器似乎并不完整,因此我并行添加了 log4j2.properties 以获得rollingAppender 的结果。

请将答案视为对所述情况进行故障排除的尝试。 答案是“常见的”,因为这里有太多事情可能会出错,如果不知道代码和配置就很难说清楚,这反映了我将如何处理这项任务

log4j 1.x 到 log4j 2.x 的迁移并不像 jars 切换那么容易。 因此,首先,请确保您了解(并应用于您的代码库)此迁移指南一些导入应该更改。

然后我认为你应该确保 log4j 1.x 不会传播到你的应用程序的工件中(一个可能的原因是它被定义为传递依赖)

为了跟踪这个,运行mvn dependency:tree并且如果没有 log4j 1.x jars - 它很好。

现在,有时(例如,在 Spring 本身的情况下),库和可能您自己的代码不直接使用 log4j 记录器,而是使用 slf4j。 在这种情况下,您需要将 slf4j 绑定到 log4j2: https ://logging.apache.org/log4j/2.0/log4j-slf4j-impl/

然后就可以开始检查配置了。 最好的方法是调试在代码中包含类似内容的应用程序:

 logger.info("Some message");

在那里放置一个断点并检查您拥有哪种类型的记录器以及真正分配给它的附加程序,也许桥无法工作并且运行时的应用程序具有无操作实现,或者,如果它是真正的实现,也许附加程序未正确分配,消息无处可去。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM