log4netを使用するときに、日付がファイル名に2回追加されるのはなぜですか?
-
06-09-2019 - |
質問
私はログファイル名に日付を追加しようとしていましたが、StackoverFlowで見つけたいくつかの提案に従って、それを機能させることができました。すべてが正常に機能しますが、何らかの理由で、最初のファイルには常に日付が2回追加されています。
たとえば、の代わりに log.2009-02-23.log, 、私は得ます log.2009-02-23.log.2009-02-23.log.
私はそれがとても奇妙でfyiであることがわかりました、これは非常に単純なコードです。マルチスレッド環境で実行しているわけではありません。
私の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 Server 2003 64ビットサービスパック2
-Log4Net 1.2.10
解決 2
それは許可の問題です。少なくともそれが私に起こっていることです。
私はlog4netを使用するのは初めてなので、内部ロギングがあることを知りませんでしたが、私はそれを見つけたので、ターンしてみました 内部ロギング の上。私はそれが何を言っているのかよくわかりませんでしたが、ここにそれが私にとってどのように見えるかがあります:1。ファイル名に日付を追加します。 2.ファイルにアクセスして書き込みをしてみてください(失敗しました)。 3.ファイル名に日付を追加します また。 4.ファイルに正常にアクセスする(今すぐ奇妙なファイル名がある)
これを知る前に、私はこの問題の解決策を求めて、このStackoverFlowの質問のタイトルとして持っているもののようなキーワードを使用していました。そこにはそれほど多くの情報がありませんでした。私はそれが何人かの人々に起こると言ったが、なぜ解決策も実際に説明したことがないと言った一人の男を見つけました。この新しい情報(+log4netからの内部エラーメッセージ)を使用して、検索エンジンとは異なるスレッドを見ていました。それで、私はそれが許可の問題かもしれないというヒントを見つけました。
ライティングアプリケーションには、ログフォルダーに十分な許可がないようです。アプリケーションのデフォルトのIDは通常、Network_Serviceです。フォルダーにもっと許可を与えて(私はそれを完全に制御しますが、それを機能させるための最小限がわかりません)、それは正常に動作します。
誰かが私よりもこれをよく説明できるなら、編集してください。
他のヒント
これは、ログシステムを初期化するときにログファイルにアクセスするのに問題がある場合に発生します。ログシステムを2回初期化した場合、別のコピーが実行されてログファイルに書き込まれているときにプログラムを実行した場合、またはテキストエディターでログファイルを編集している場合に発生する可能性があります。基本的に、log4net initが実行されたときにログファイルに書き込みロックを引き起こすものは何でも。
log4net initへの複製コールについては、コードを確認してください - おそらく、たとえば、シングルトンの静的コンストラクターやグローバルINITではなく、コンストラクターで初期化している可能性があります。
これは、「Webガーデン」構成で実行されており、ファイル名にPIDを含めない場合にも発生する可能性があります。 Webガーデンを使用してファイルに書き込む場合、各サーバープロセスが独自のファイルを取得するように、ファイル名パターンにPIDを追加します。
私は同じ問題に遭遇します。私にとって、それは私のテストログにRollingFileAppenderを使用し、Resharperで私のヌニットテストを実行する組み合わせでした。
Resharperが使用していることがわかります 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
の使用に注意してください パターンストリング 「タイプ」の場合。
それが役立つことを願っています。
オルが指摘したように。あなたの問題は、log4netが別のdateformatとして解釈している「 g」に関連しています。 「.yyyy-mm-dd.lo g」を削除して、「yyyy-mm-dd」に置き換えてみてください
「.log」はdateformatに属していません
以下を使用します。
<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>
これで、2009.02.23.logのようなファイル名を取得します
試す <datePattern value=".yyyy-MM-dd.lo\g" />
私は gのためのものがわかりません。