web-dev-qa-db-ja.com

毎日異なるフォルダーにファイルを記録するようにlog4netを設定するにはどうすればよいですか?

  1. 毎日のすべてのログをYYYYMMddという名前のフォルダーに保存したい-log4netはシステムの日時に応じて新しいフォルダーの作成を処理する必要があります-これを設定するにはどうすればよいですか?
  2. 日中のすべてのログを1MBのn個のファイルに保存したい-古いファイルを書き直したくないが、実際には1日の間にすべてのログを保持したい-これを設定するにはどうすればよいですか?

私はC#を使用しています

よろしくアレックス

20
halex

これを試してください(大丈夫です!):

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\\" />
  <appendToFile value="true" />
  <DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" />
  <rollingStyle value="Date" />
  <param name="StaticLogFileName" value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <header value="[Header]&#13;&#10;" />
    <footer value="[Footer]&#13;&#10;" />
    <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
  </layout>
</appender>

'logs\2010\04\02.inf.log'という名前のログファイルが作成されます(日付を2010-04-02とします)

19
he_king

皆さん、ありがとうございました。 RollingFileAppenderから継承するSortByFolderFileAppenderを作成しました

最終結果の例:somewhere\Logs\20100305\Client-104615.0

namespace CustomLogging
{
  public class SortByFolderFileAppender : log4net.Appender.RollingFileAppender
  {
    protected override void OpenFile(string fileName, bool append)
    {
      //Inject folder [yyyyMMdd] before the file name
      string baseDirectory = Path.GetDirectoryName(fileName);
      string fileNameOnly = Path.GetFileName(fileName);
      string newDirectory = Path.Combine(baseDirectory, DateTime.Now.ToString("yyyyMMdd"));
      string newFileName = Path.Combine(newDirectory, fileNameOnly);

      base.OpenFile(newFileName, append);
    }
  }
}
<appender name="SortByFolderFileAppender" type="CustomLogging.SortByFolderFileAppender">
  <file type="log4net.Util.PatternString" value="Logs\Client"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-HHmmss"/>
  <maxSizeRollBackups value="40"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>
11
halex

FileAppenderクラスに基づいて、独自のアペンダーを作成できると思います。正しい場所にファイルを作成するには、OpenFileメソッドをオーバーライドする必要がある場合があります。

1
Kerido

日付で名前が付けられたファイルを作成し、深夜に新しいファイルを開始するrollinglogfileappenderを使用できます。次に、それらを00.01の正しいマップに移動するスクリプトを記述します。

1日の間にすべてのファイルを1ファイルあたり最大1MBでログに記録する場合の例を次に示します。

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="Logging\\MWLog"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-yyyyMMdd"/>
  <maxSizeRollBackups value="-1"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>
1
Carra

SortByFolderFileAppenderを使用して、上記の回答からビルドします。

これが、ログファイル名のローリング日付を使用して問題を解決した方法です。 staticLogFileNameをtrueに変更して、ファイル名全体がOpenFileメソッドに渡されるようにしました。

ファイル名が「.log」で終わる場合は、何も追加する必要はありません。なんらかのロックが発生したと思います。以前のロックが解除されていることを期待して、log4netで同じファイル名をもう一度使用してみてください。

ただし、ファイルがロックされていて手放さない場合に、これによってOpenFileが無限に呼び出される可能性があるかどうかはわかりません。生産者/消費者パターンを使用してWebサービスを作成し、システム内のすべてのアプリケーションからすべてを1つの場所に記録しました。これは、現在10であり、成長しています。

Log4netを他のアプリケーションに含める必要はありませんが、すべてのアプリケーションがWebサービスへのロギングに使用できるWebクライアントクラスを作成する必要がありました。

ファイル名の結果は「Logs\Client\2017\11\08.log」であり、明らかに毎日変更されます。

protected override void OpenFile( string fileName, bool append )
{
    // append "\yyyy\mm\dd.log" to create the correct filename.
    if ( !fileName.EndsWith( ".log") )
        fileName = $@"{fileName}\{DateTime.Now:yyyy\\MM\\dd}.log";

    base.OpenFile( fileName, append );
}

上からの構成の変更。

<appender name="xxxRollingFileAppender" type="namespace.xxxRollingFileAppender">
    <file value="Logs\Client"/>
    <staticLogFileName value="true"/>
    <appendToFile value="true"/>
    <maxSizeRollBackups value="40"/>
    <maximumFileSize value="1MB"/>
    <encoding value="utf-8"/>
    <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
    </layout>
</appender>
1
kdahl