2015-12-03 45 views
4

我有一個在JBoss 5.1上運行的大型應用程序,並通過slf4j使用log4j。當我在當地碼頭工人容器測試,我可以在日誌中看到通常package.class名稱:org.jboss.logging.Logger而不是根據運行時環境打印在日誌中的類名

03 Dec 15 09:45:39, DEBUG my.fancy.app.filters.TicketValidationFilter:doFilter:30 Ticket was verified with data: uniqueID=gfd, idnumber=sdf, mid=11246986. 
03 Dec 15 09:45:39, DEBUG my.fancy.app.MyServlet:doGet:30 Request for secret data with uniqueId=gfd 
03 Dec 15 09:45:39, WARN my.fancy.app.MyServlet:doGet:36 Could not retrieve SecretData with uniqueId=gfd 

然而,當我部署相同的代碼在開發環境(這可能不乾淨......)我得到:

03 dec 15 10:45:22, DEBUG org.jboss.logging.Logger:debug:228 Ticket was verified with data: uniqueID=sdg, idnumber=sdf, mid=11738149. 
03 dec 15 10:45:22, DEBUG org.jboss.logging.Logger:debug:228 Request for secret data with uniqueId=sdg 
03 dec 15 10:45:22, WARN org.jboss.logging.Logger:warn:352 Could not retrieve SecretData with uniqueId=sdg 

我在兩種環境中比較了jboss-log4j.xml,它們是相同的。我還檢查了啓動標誌以查看日誌記錄提供程序是否已設置,但它不在這些環境中。

我應該在哪裏看下?

更新

我應該還提到,以前我們一直用直接和log4j的,所以我們還是有直接的log4j進口,在這裏和那裏散落實例。奇怪的是,那些使用log4j記錄的條目在所有環境中均正確顯示,而那些僅使用slf4j的條目。這應該是slf4j在違規環境中沒有真正配置的線索。問題是我應該在哪裏解決它?

更新2

這是附加器配置:

<appender name="MYAPP_FILE" class="org.jboss.logging.appender.DailyRollingFileAppender"> <param name="File" value="${jboss.server.log.dir}/myapp.log" /> <param name="Append" value="true" /> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{dd MMM yyy HH:mm:ss}, %-6p %C:%M:%L %m %n" /> </layout> </appender>

記錄器declartation:

import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... public class MyServlet extends HttpServlet { private Logger log = LoggerFactory.getLogger(MyServlet.class.getName()); ... log.debug("Request for secret data with uniqueId={}", secretDataVO.getUniqueId()); ... }

在pom.xml我有:

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.10</version> <scope>provided</scope> </dependency>

對log4j的依賴是有的,因爲在應用程序代碼的其他地方我們仍然直接使用log4j。 slf4j-log4j12被標記爲已提供,因爲它由同一個jboss實例中的另一個工件加載。

更新3

有開始時的JBoss顯示錯誤:

2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. 2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR [[email protected]{vfszip:/my-jboss-root/jboss/server/default/deploy/fancyApp.ear/fancyApp-web.war/}] whereas object of type 2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR "org.jboss.logging.appender.FileAppender" was loaded by [[email protected]]. 2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE".

凡fancyApp-web.war中是一個裝載SLF4J-log4j12。我之前看到過這個錯誤,但沒有提及它,因爲它在本地(docker)和dev環境中都出現了(甚至在這個問題上也是如此......)

+1

請附上您的slf4j配置文件(主要用於日誌格式)並顯示如何聲明您的記錄器。此外,您應該重新檢查應用程序依賴關係,以便它們包含slf4j和log4j所需的文件。你在使用傳統的log4j嗎? –

+1

@Taavi:查看附加信息。我不知道「傳統」log4j是什麼意思。 – inovaovao

回答

0

嘗試使用LoggerFactory.getLogger(MyServlet.class)並且在此處顯示:http://www.slf4j.org/api/org/slf4j/LoggerFactory.html#getLogger%28java.lang.Class%29

萬一向clazz參數不同於呼叫者如 由SLF4J內部計算的名稱,一個記錄器名稱不匹配的警告將是 打印,但僅當slf4j.detectLoggerNameMismatch系統屬性 被設置爲真正。默認情況下,該屬性未設置,即使記錄器名稱不匹配,也不會打印任何警告 。

還在您的log4j.xml中設置debug="true",並觀察log4j初始化。

+0

爲什麼要改變什麼?你的意思是我應該看看,如果啓用調試時日誌中應該出現一些特定的錯誤? – inovaovao

+0

是的,你應該檢查你的日誌環境是如何設置的,抱歉沒有明確指出它。 –

0

將生產環境的調試器設置爲true並且也在配置文件中。

+0

你的意思是獲得調試日誌?我應該尋找什麼?你在說什麼配置文件? – inovaovao

+0

JBoss_HOME \ server \ default \ conf \ jboss-log4j.xml – vyshakhbabji

+0

另外這可能會給你一些見解:https://community.jboss.org/thread/200818?tstart = 0 – vyshakhbabji