2

Log4netを使用してINFOおよびWARNレベルのログエントリを介して使用状況を追跡する、単一のサーバーでWCFサービスを実行しています。次の非常に標準的な構成で RollingFileAppender を使用します。

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="\\mylocation\data\PRD\myApp\MyService"/>
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="-yyyy-MM-dd'.log'" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
   <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="ADONetAppender_SqlServer" />
    </root> 

また、リダイレクトされた「WARN」レベルのデータを受け取り、ストアド プロシージャを介して SQL サーバーの DB テーブルに書き込む ADONetAppender も使用します。この設定は少し長いので、読みやすくするために省略しています。

このセットアップは、正常に実行されている開発環境と TST 環境で行われています。PRD 環境では、重複したログ ファイルが生成されるようです。1 つ目は、指定したパターン、つまり「logfile-yyyy-mm-dd.log」に従って名前が付けられています。2 番目のファイルは最初のファイルに追加されたように見え、日付パターンが重複しています。つまり、「logfile-yyyy-mm-dd.log.-yyyy-mm-dd.log」です。

これをさらに興味深いものにしているのは、2 つのファイルに含まれるエントリが時間的に重複していることです。ファイル 1 には午前 8 時から午前 12 時までのエントリが含まれ、ファイル 2 にも同じ時間帯のエントリが含まれます。エントリは重複ではなく、サービスの異なるユーザーによって生成されます。ファイル 1 と 2 のコピーはほとんど任意のサイズにすることができるため、これは、サイズまたは日付/時刻のしきい値に達して、次に必要なログ ファイルを生成するという問題ではありません。

DB テーブルのエントリには、予想されるすべての行が含まれており、一部は各ログ ファイルに含まれています。これらの行は WARN レベルのロギングによってのみ生成され、一部の WARNing は各ログ ファイルに表示されます。

私たちのショップのlog4netに精通した人々からこれを跳ね返しましたが、この重複ファイルの動作の原因をよく知っている人は誰もいません. Stackland からのアイデアを歓迎します。

4

2 に答える 2

0

これは、ログに記録されているファイルが別のスレッドまたはプロセスによってロックされている場合に発生することがわかりました。

構成されたログファイルにログを記録できず、新しいファイルを作成してログに記録するため、Log4Net は他のファイルを作成すると想定していますが、その仮定を確認するには log4net コードを実行する必要があります。

追加してみる

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

アペンダー要素に追加して、ロックの量を最小限に抑えます。MinimalLock の使用に関連する追加のオーバーヘッドがあることに注意してください: http://logging.apache.org/log4net/release/sdk/log4net.Appender.FileAppender.MinimalLock.html

于 2014-01-15T11:26:30.413 に答える
0

日付パターンの後に .log を付けるべきではありません。また、ルートで 2 つのアペンダーが宣言されている理由もわかりません。構成の残りの部分には目的がないことを考えると、ルートを完全に取り除くことができるはずです (例にないものがないことを前提としています)。

于 2012-05-17T16:55:53.417 に答える