簡體   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