[英]How to configure the log4j output file path in web.xml and log4j.properties?
[英]How to configure multiple log4j for different wars in a single EAR?
我的EAR結構如下:
APP.ear
- APP1.war
- WEB-INF/classes/log4j.properties
- APP2.war
- WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)
我希望每個WAR都有自己的應用程序日志。 但似乎上面的配置不起作用。 APP1和APP2的日志轉到APP1的日志。 反正有沒有創建單獨的應用程序日志?
事實證明,由於類加載器,這是不可能的。 類加載器層次結構如下:
應用程序類加載器 - > Ejb類加載器 - > war類加載器
為了獲得單獨戰爭的sepearte日志,可以將log4j.jar置於戰爭中並讓log4j使用war類加載器。 但由於app1-ejb.jar和app2-ebj.jar都需要使用log4j,因此log4j.jar只能放在頂層。 所以log4j在應用程序類加載器級別。
我可以指定一個log4j配置來將不同的包記錄到不同的文件中。 但對於像春天這樣的公共圖書館,日志不能分開。
它之所以沒有用,是因為log4j存在於根位置,而是讓每個war在其WEB-INF / lib目錄中都有一個Log4j.jar,並從root中刪除log4j.jar。
有關這方面的更多信息,請參閱我的博客文章http://techcrawler.wordpress.com/
您也可以使用代碼中的PropertyConfigurator動態更改屬性文件中的FILE屬性。
Logback是解決此問題的可行解決方案。 在瀏覽了不同的hack以使用log4j后,我們決定切換到Logback。 我在webapp中使用了Logback jar的以下配置。
webapp中的Logback文件,包含一個外部文件:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<contextName>${project.artifactId}</contextName>
<jmxConfigurator />
<include file="${logback.configuration.filepath}" />
</configuration>
在Maven過濾期間, ${logback.configuration.filepath}
將被配置文件的webapp外部的確切路徑替換(類似於/opt/server/conf/loback.included.conf )。
然后, logback.included.conf
的內容(此文件是projetct的一部分,隨build-helper:attach-artifact
,因此在Maven過濾期間也會替換${project.artifactId}
):
<?xml version="1.0" encoding="UTF-8" ?>
<included>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>/var/log/server/${project.artifactId}.log</file>
<encoder>
<pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="file" />
</root>
</included>
只有限制,包含文件的內容必須符合包含者的內容。 只是寫規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.