2011-02-25 172 views
36

我正在研究一組Web服務,我們希望每天都有一個輪換的日誌。在log4j中配置RollingFileAppender

我試圖從log4j extras companion工作中獲得org.apache.log4j.rolling.RollingFileAppender,因爲文檔建議這對於生產環境來說是最好的。

我在類路徑上都有log4J庫(log4j-1.2.15.jar)和log4j臨時庫(apache-log4j-extras-1.1.jar)。

我在log4j.properties文件的appender以下配置:

### SOAP Request Appender 
log4j.appender.request=org.apache.log4j.rolling.RollingFileAppender 
log4j.appender.request.File=SOAPmessages.log 
log4j.appender.request.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy 
log4j.appender.request.RollingPolicy.ActiveFileName =SOAPmessages-%d.log 
log4j.appender.request.RollingPolicy.FileNamePattern=SOAPmessages-%d.log.zip 
log4j.appender.request.layout = org.apache.log4j.PatternLayout 
log4j.appender.request.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 

然而,當我在調試模式下的log4j啓動Web服務,我得到這些錯誤消息:

log4j: Parsing appender named "request". 
log4j: Parsing layout options for "request". 
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n]. 
log4j: End of parsing for "request". 
log4j: Setting property [file] to [/logs/SOAPmessages.log]. 
log4j:WARN Failed to set property [rollingPolicy] to value "org.apache.log4j.rolling.TimeBasedRollingPolicy". 
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'request' 
log4j: Parsed "request" options. 

我發現有關如何配置這個appender有點稀疏的文檔,所以誰能幫我修復我的配置?

EDIT0:新增調試模式輸出,而不僅僅是標準的警告

+0

提供要解決此問題的一個例子,我想你可以嘗試打開Log4j的調試模式,看看是否有任何更詳細的錯誤信息 – 2011-02-25 15:16:36

+0

不是一個答案,只是一個建議。你真的應該看看logback。它比log4j更加靈活。 – 2011-03-14 20:38:37

+6

僅供參考:此問題在log4j v1.2.16中修復。它現在支持通過屬性文件設置rollingPolicy。 https://issues.apache.org/bugzilla/show_bug.cgi?id=36384 – Kevin 2011-09-30 22:07:50

回答

14

根據Log4jXmlFormat你不能log4j.properties配置,但僅使用XML配置格式:

Note that TimeBasedRollingPolicy can only be configured with xml, not log4j.properties

不幸的是,他們的log4j.xml提供的例子不工作之一:

log4j:ERROR Parsing error on line 14 and column 76 
log4j:ERROR Element type "rollingPolicy" must be declared. 
... 
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'FILE' 
+0

我看到了,沒有注意到在任何文檔中,我閱讀,也沒有任何鏈接到維基將有所幫助。感謝您指出了這一點+1 – chrisbunney 2011-03-14 23:48:39

+3

這可能是真實的日期你回答,但它工作正常log4j.properties文件,至少對我來說 – 2013-09-26 23:50:11

+0

有一個來自Apache的「log4j-extras」包,在那裏你可以找到「 rollingPolicy「定義。它會解決你的許多問題 – 2016-06-27 09:52:54

0

我懷疑的ActiveFileName財產。根據log4j javadoc,TimeBasedRollingPolicy類沒有這樣的屬性。 (沒有setActiveFileNamegetActiveFileName方法。)

我不知道指定未知屬性會做什麼,但它可能會導致包含對象被放棄,並可能導致您看到的警告。

試着把它拋出去看看會發生什麼。

+0

「ActiveFileName」屬性記錄在這裏:http://logging.apache.org/log4j/companions/extras/apidocs/org/ apache/log4j/rolling/TimeBasedRollingPolicy.html我會嘗試把它拿出來,看看會發生什麼 – chrisbunney 2011-02-25 14:41:15

+0

註釋掉'ActiveFileName'屬性不會改變觀察到的行爲 – chrisbunney 2011-02-25 14:42:57

4

Toolbear74正確log4j.XML是必需的。 爲了讓XML驗證<param>標記必須前<rollingPolicy> 我建議設置一個記錄門檻<param name="threshold" value="info"/>

當創建的log4j.xml文件,不要忘記向log4j.dtd複製到同一地點。

下面是一個例子:

<?xml version="1.0" encoding="windows-1252"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
<!-- Daily Rolling File Appender that compresses old files --> 
    <appender name="file" class="org.apache.log4j.rolling.RollingFileAppender" > 
    <param name="threshold" value="info"/> 
    <rollingPolicy name="file" 
         class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" 
       value="${catalina.base}/logs/myapp.log.%d{yyyy-MM-dd}.gz"/> 
     <param name="ActiveFileName" value="${catalina.base}/logs/myapp.log"/> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.EnhancedPatternLayout" > 
     <param name="ConversionPattern" 
       value="%d{ISO8601} %-5p - %-26.26c{1} - %m%n" /> 
    </layout> 
    </appender> 

    <root> 
    <priority value="debug"></priority> 
    <appender-ref ref="file" /> 
    </root> 
</log4j:configuration> 

考慮到您的設定FileNamePatternActiveFileName我認爲,設置一個File屬性是多餘的,甚至可能是錯誤的

嘗試重命名你的log4j.properties和丟棄在類似於我的例子的log4j.xml中,看看會發生什麼。

+0

是的,它需要使用XML配置+1 – chrisbunney 2011-04-04 18:20:37

+0

我寧願將一個額外的庫放到類路徑中,而不是使用XML來執行此任務,因爲我已經在屬性樣式中進行了很多配置,所以僅僅因爲一個appender不合邏輯而重寫所有文件 – msangel 2013-11-11 19:26:01

52

我也有類似的問題,只是找到了一種方法來解決這個問題(由單步調試源log4j-extras,毫不遜色......)

好消息是,不像什麼書面無處不在,事實證明這實際上,你可以使用log4j.properties配置TimeBasedRollingPolicy(!不是至少在log4j的版本需要XML配置> 1.2.16看到這個bug report

下面是一個例子:

log4j.appender.File = org.apache.log4j.rolling.RollingFileAppender 
log4j.appender.File.rollingPolicy = org.apache.log4j.rolling.TimeBasedRollingPolicy 
log4j.appender.File.rollingPolicy.FileNamePattern = logs/worker-${instanceId}.%d{yyyyMMdd-HHmm}.log 

BTW的${instanceId}位的東西我使用亞馬遜的EC2,從我的所有工人區分日誌 - 我只需要調用PropertyConfigurator.configure()之前設置該屬性,如下:

p.setProperty("instanceId", EC2Util.getMyInstanceId()); 
PropertyConfigurator.configure(p); 
+1

最近,我創建了一個[補丁](http://pastebin.com/DugN7AiZ),以允許配置遞歸目錄。例如,您可以在每月的子目錄中存儲每日壓縮日誌文件,如下所示:'log4j.appender.File.rollingPolicy.FileNamePattern = Logs /%d {yyyyMM}/ServerLog_%d {yyyyMMdd} .log.zip'。所需的目錄將在需要時由log4j正確創建。 – Moreaki 2015-10-28 09:11:57

0

你有一個壞包命名

org.apache.log4j.rolling.RollingFileAppender 

正確的是:

org.apache.log4j.RollingFileAppender 
+9

實際上,兩者都是有效的軟件包名稱。一個是指在[主log4j庫](https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/RollingFileAppender.html)中實現RollingFileAppender,而另一個指的是[log4j extras庫](https://logging.apache.org/log4j/companions/extras/apidocs/index.html?org/apache/log4j/rolling/RollingFileAppender.html)中的實現,它提供了一個各種替代過濾器和appender。主包中的實現特別推薦使用extras實現。 – chrisbunney 2012-03-24 15:07:06

15

面對更多的問題,同時使這項工作。這裏是詳細信息:

  1. 要下載並在類路徑中添加apache-log4j-extras-1.1.jar,最初沒有注意到這一點。
  2. RollingFileAppender應該是org.apache.log4j.rolling.RollingFileAppender而不是org.apache.log4j.RollingFileAppender。這可能會導致錯誤:log4j:ERROR No output stream or file set for the appender named [file].
  3. 我們必須將log4j庫從log4j-1.2.14.jar升級到log4j-1.2.16.jar

下面是附加器配置,其工作對我來說:

<appender name="file" class="org.apache.log4j.rolling.RollingFileAppender"> 
     <param name="threshold" value="debug" /> 
     <rollingPolicy name="file" 
      class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
      <param name="FileNamePattern" value="logs/MyLog-%d{yyyy-MM-dd-HH-mm}.log.gz" /> 
      <!-- The below param will keep the live update file in a different location--> 
      <!-- param name="ActiveFileName" value="current/MyLog.log" /--> 
     </rollingPolicy> 

     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" /> 
     </layout> 
</appender> 
+0

謝謝你。完全不知道o.a.log4j.RFAppender和o.a.log4j.rolling.RFAppender之間的區別。需要有人指出明顯的。 – 2012-12-12 15:51:47

+0

我有log4j-1.2.17.jar,但它沒有下面的包org.apache.log4j.rolling.RollingFileAppender – yatinbc 2015-07-24 06:16:12

+0

@yatinbc,得到log4j extras包。 – 2015-07-24 06:48:31

3

關於錯誤:log4j:ERROR Element type "rollingPolicy" must be declared

  1. 使用log4j.jar版本比log4j的-1.2.14.jar,更新其具有​​定義rollingPolicy
  2. 當然你還需要apache-log4j-extras-1.1.jar
  3. 檢查你使用的是否有其他第三方的罐子,或許有一個老版本的log4j.jar打包在裏面。 如果是這樣,請確保您的log4j.jar在第三方包含較早的log4j.jar之前的順序中排在第一位。
1

在Log4j2中,「extras」lib不再是必需的。此外,配置格式已更改。

Apache documentation

property.filename = /foo/bar/test.log 

appender.rolling.type = RollingFile 
appender.rolling.name = RollingFile 
appender.rolling.fileName = ${filename} 
appender.rolling.filePattern = /foo/bar/rolling/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz 
appender.rolling.layout.type = PatternLayout 
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n 
appender.rolling.policies.type = Policies 
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 
appender.rolling.policies.time.interval = 2 
appender.rolling.policies.time.modulate = true 
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy 
appender.rolling.policies.size.size=100MB 
appender.rolling.strategy.type = DefaultRolloverStrategy 
appender.rolling.strategy.max = 5 


logger.rolling.name = com.example.my.class 
logger.rolling.level = debug 
logger.rolling.additivity = false 
logger.rolling.appenderRef.rolling.ref = RollingFile