web-dev-qa-db-ja.com

log4jでRollingFileAppenderを構成する

私は一連のWebサービスに取り組んでおり、毎日ローテーションされたログを取得したいと考えています。

ドキュメンテーションがこれが実稼働環境に最適であると示唆しているため、log4j extrasコンパニオンからorg.Apache.log4j.rolling.RollingFileAppenderを取得しようとしています。

クラスパスにメインのlog4Jライブラリ(log4j-1.2.15.jar)とlog4j extrasライブラリ(Apache-log4j-extras-1.1.jar)の両方があります。

log4j.propertiesファイルには、アペンダーの次の構成があります。

### 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.

このアペンダーを少しまばらに設定する方法に関するドキュメントを見つけましたので、私の設定を修正するのを手伝ってくれる人はいますか?

EDIT0:標準の警告だけでなく、デバッグモード出力を追加

40
chrisbunney

更新:少なくとも2013年には早くも(Mubasharのコメントを参照)、これは機能し始めました。


Log4jXmlFormat によると、log4j.propertiesで構成することはできませんが、XML構成形式のみを使用します。

TimeBasedRollingPolicyは、log4j.propertiesではなく、xmlでのみ構成できることに注意してください。

残念ながら、彼らが提供するサンプルの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'
16
toolbear

私は同様の問題を抱えていて、それを解決する方法を見つけました(log4j-extrasソースを介してシングルステップで...)

幸いなことに、どこにも書かれているものとは異なり、実際にlog4j.propertiesを使用してTimeBasedRollingPolicyを構成できます(XML構成は不要です! log4j> 1.2.16のバージョンでは、これを参照してください バグレポート

以下に例を示します。

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

ところで、${instanceId}ビットは、AmazonのEC2でログをすべてのワーカーと区別するために使用しているものです。次のように、PropertyConfigurator.configure()を呼び出す前にそのプロパティを設定するだけです。

p.setProperty("instanceId", EC2Util.getMyInstanceId());
PropertyConfigurator.configure(p);
61
Pierre D

この作業中に多くの問題に直面しました。詳細は次のとおりです。

  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>
20
James Jithin

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をドロップして、何が起こるかを確認してください。

4
Raystorm

エラーについて:log4j:ERROR Element type "rollingPolicy" must be declared

  1. log4j.dtdrollingPolicyを定義しているlog4j-1.2.14.jarより新しいlog4j.jarバージョンを使用します。
  2. もちろんApache-log4j-extras-1.1.jarも必要です
  3. 使用している他のサードパーティjarに古いバージョンのlog4j.jarが含まれている可能性があるかどうかを確認します。その場合は、log4j.jarが含まれているサードパーティの前に、log4j.jarが最初に来るようにしてください。
3
Newbie

Log4j2では、「extras」ライブラリは必須ではなくなりました。また、構成形式が変更されました。

例が Apacheドキュメント で提供されています

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
2
alain.janinm

悪いパッケージ名があります

org.Apache.log4j.rolling.RollingFileAppender 

正しいものは次のとおりです。

org.Apache.log4j.RollingFileAppender 
0
george

ActiveFileNameプロパティが疑わしい。 log4j javadocによると、TimeBasedRollingPolicyクラスにはそのようなプロパティはありません。 (setActiveFileNameまたはgetActiveFileNameメソッドはありません。)

不明なプロパティを指定するとどうなるかはわかりませんが、それを含むオブジェクトが破棄される可能性があり、その結果、警告が表示される可能性があります。

そのままにして、何が起こるか見てみてください。

0
Stephen C