23

ログ ファイル名に日付を追加しようとしていましたが、stackoverflow で見つけたいくつかの提案に従うことで機能させることができました。すべて正常に動作しますが、何らかの理由で、最初のファイルには常に日付が 2 回追加されます。

たとえば、 log.2009-02-23.log の代わりに、log.2009-02-23.log.2009-02-23.logを取得します

とても奇妙でわかりましたが、これは非常に単純なコードです。マルチスレッド環境で実行しているわけではありません。

私のlog4net設定:

<log4net>
<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
    <file value="../../Logs/Mylog"/>
    <staticLogFileName value="false" />
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd.lo\g" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="MyLog"/>
</root>
</log4net>

理由はありますか?

編集:これをテストしている環境に関する情報を追加したい.
-asp.net
-.netフレームワーク2.0
-Windowsサーバー2003 64ビットサービスパック2
-log4net 1.2.10

4

6 に答える 6

11

これは、ログ システムを初期化するときにログ ファイルへのアクセスに問題がある場合に発生します。ログ システムを 2 回初期化した場合、別のコピーが実行されてログ ファイルに書き込みを行っているときにプログラムを実行した場合、またはログ ファイルをテキスト エディタで編集している場合に発生する可能性があります。基本的に、log4net init の実行時にログ ファイルの書き込みロックを引き起こすもの。

log4net init への重複した呼び出しがないかコードを確認してください。たとえば、シングルトンの静的コンストラクターまたはグローバル init ではなく、コンストラクターで初期化している可能性があります。

これは、「Web ガーデン」構成で実行していて、ファイル名に PID を含めない場合にも発生する可能性があります。これは、異なる Web サーバー プロセスがそれぞれ同じファイルに書き込もうとするためです。Web ガーデンを使用してファイルに書き込む場合は、pid をファイル名パターンに追加して、各サーバー プロセスが独自のファイルを取得するようにします。

于 2009-03-25T04:26:08.690 に答える
8

許可の問題です。少なくともそれが私に起こっていることです。

私はLog4Netを初めて使用したので、内部ログがあることを知りませんでしたが、見つけたので内部ログをオンにしてみました。何を言っているのかよくわかりませんでしたが、私には次のように見えます。 1. ファイル名に日付を追加します。2. ファイルにアクセスして書き込みを試みます (失敗)。3. ファイル名に日付を再度追加します。4.ファイルに正常にアクセスします(現在、奇妙なファイル名になっています)

これを知る前に、このスタックオーバーフローの質問のタイトルとして持っているようなキーワードを使用して、この問題の解決策をグーグルで調べていました。そこまで情報はありませんでした。一部の人に起こると言ったが、その理由や解決策を実際に説明していない人を見つけたかもしれません. この新しい情報 (+ Log4Net からの内部エラー メッセージ) を使用して、検索エンジンのさまざまなスレッドを調べていました。それで、許可の問題である可能性があるというヒントを見つけました。

書き込みアプリケーションには、logs フォルダーへの十分な権限がないようです。通常、アプリケーションのデフォルト ID は NETWORK_SERVICE です。フォルダーにさらにアクセス許可を与えた後 (フル コントロールを与えましたが、動作させるための最小値はわかりません)、問題なく動作します。

誰かが私よりもこれをうまく説明できる場合は、自由に編集してください。

于 2009-02-27T01:57:52.243 に答える
3

私は同じ問題に遭遇します。私にとっては、テストログにRollingFileAppenderを使用することと、ReSharperを使用してNUnitテストを実行することの組み合わせでした。

ReSharperは2つのプロセスを使用してテストを実行していることがわかりました。

2人のタスクランナー

これにより、ログファイルに競合状態が作成されます。

ここで、ログファイル名を変更してプロセスIDを含めると、次のようになります。

<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="false"/>
  <datePattern value="_yyyy-MM-dd'.log'"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" />
  </layout>
</appender>

問題は解決しました。各ファイルには、独自の一意の名前が付けられます。

MyLog.pid.5440_2010-10-13.log
MyLog.pid.1496_2010-10-13.log

'type'にPatternStringを使用していることに注意してください。

お役に立てば幸いです。

于 2010-10-13T21:35:14.440 に答える
1

オルレが指摘したように。問題は、log4netが別の日付形式として解釈している「\g」に関連しています。「.yyyy-MM-dd.lo\g」を削除して、「yyyy-MM-dd」に置き換えてみてください

「.log」は日付形式に属していません

于 2009-02-23T23:07:07.933 に答える
1

私は以下を使用します:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>

これで、次のようなファイル名を取得します: 2009.02.23.log

于 2009-02-26T09:26:35.840 に答える
0

<datePattern value=".yyyy-MM-dd.lo\g" />\gが何のためにあるのか理解できません。

于 2009-02-23T22:41:57.463 に答える