2017-06-23 150 views
0

ローリングファイルアペンダのデフォルトロールオーバー戦略をプログラム的に変更しようとしているプログラムがあり、IfFilNameパス条件をそのままにしておくと、 IfLastModifiedのパス条件のみを使用するので、すべてが完全に動作しているように見えますが、IfFileName条件を追加するとファイルの削除が中止されます...Log4j2ローリングファイルアペンダIfFileName条件でファイルが見つからない/削除されない

この条件を作成する方法に問題があります。あなたが見ることができるように

<RollingFile name="RollingFile" fileName="cc" filePattern="logs/${baseFileName}-%d{yyyy-MM-dd}.log.gz"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-40t] %-5level %-80.80l - %msg%n"/> 
     <TimeBasedTriggeringPolicy interval="1" modulate="true"/> 
     <DefaultRolloverStrategy> 
      <Delete basePath="logs/"> 
       <IfFileName glob="${baseFileName}-*.log.gz" /> 
       <IfLastModified age="2d" /> 
      </Delete> 
     </DefaultRolloverStrategy> 
    </RollingFile> 

ので、各ログファイルをベースディレクトリにログフォルダに保存されている、このちなんで命名され -

私のxmlファイルには、これはアペンダとして設定していますプロパティ先頭に設定 -

<Properties> 
    <Property name="baseFileName" value="VrsEditor"/> 
</Properties> 

baseFileNameは、設定ファイル/クラスは、ロギングを行っているかに基づいているので、プログラムの異なるサービスは異なる名前を持っているので、それが

...このように設定されています

この設定ファイルは、素晴らしい作品と仕事をしていませんが、私は戦略上のデフォルトのロールを変更するには、私の方法を適用すると、私はここにIfFileName条件

を含む場合、それは動作を停止し、私はその条件を設定しています方法です -

IfFileName fileName = IfFileName.createNameCondition("${baseFileName}-*.log.gz", "${baseFileName}-*.log.gz"); 

createNameCondition方法は、私は文字列のグロブ値と文字列の正規表現の値を渡す必要があり、この方法については、これthis--

createNameCondition(       @PluginAttribute(value="glob") 
               String glob, 
               @PluginAttribute(value="regex") 
               String regex) 

のようなものです....そしてあなたが私の上に見ることができるようにちょうどまったく同じStringを使用このメソッドを変更するには、ファイルが保存されている日数のIfLastModified条件が必要なため、元の設定ファイルにあります。

誰でも、なぜこのIfFileName条件が機能していないのか分かりますが、元の設定ファイルと同じ値を渡しても動作しますか?

私は弦の部分としての正規表現の部分がまったく同じものでなければならないと思っていますか?

"$ {baseFileName} - *。log.gz"をregexに変換するためにどのような正規表現変換を使用する必要がありますか?このIfFileName条件がプログラムでは動作しないが、構成ファイル自体から動作する理由は他にもあるでしょうか?

答えて

0

設定ファイルの先頭に<Configuration status="trace">を設定することで、何が起きているのかをデバッグすることができます。これにより、内部Log4j2デバッグ文がコンソールに出力されます。 Log4j2のカスタム削除アクションにはかなり詳細なログがあります。

あなたのglobの${baseFileName}部分が文字通り解釈されていると私は考えています。これは、カスタム削除アクションが発生する前に、これがパスに置き換えられる変数になりたいのですが、パターンが置き換えられていない可能性があります。

デバッグは何が起こっているかを示します。私が正しいとすれば、代わりにリテラル値を使用することです。 (また、Log4j2のJIRAのissueトラッカーで機能要求を発行することもできます)

関連する問題