私は特定のユースケースの解決策を求めて Stack とネットを探し回っていますが、まだ見つけていません。
Log4Net 1.2.10 CastleCore を使用する IIS 6.1 .NET アプリケーション
私の要件は、ファイル名にプロセス ID、日付、および時間を使用して、1 時間あたりのプロセス ID に基づいて一意のファイル名を作成することです。ただし、プロセス ID がその時間内に変更された場合は、そのプロセス ID と日付/時間に基づいて新しいファイル名を作成します。
IIS の Web ファームでサービスを実行しています。これには 4 つのワーカー プロセスが同時に実行されており、2 つのアプリ プールとプールごとに 2 つのプロセスがあります。そのため、4 つのログ ファイルが同時に書き込まれています。
私の現在の構成(以下)は、ある程度まで機能するようです。ファイルが作成され、同時にログに記録されます。1 時間の間にプロセス ID ごとに約 200MB のログが記録されるという点で、ログはかなり重くなります。
1 時間の間に、2 つのファイルのうちの 1 つが単に書き込みを停止します。デッドロック、競合状態、または衝突を防ぐ必要がある最小限のロックと異なるプロセス ID を設定しました。
私の現在の設定は以下です
<appender name="WSG_file_appender" type="WSG.Logger.LogAppender,WSG.Logger">
<file type="log4net.Util.PatternString" value="../../WSG/IWSGServices-[%processid]" />
<datePattern value="-dd.MM.yyyy-HH'.log'" />
<staticLogFileName value="false"/>
<rollingStyle value="Date" />
<appendToFile value="true" />
<maximumFileSize value="500MB" />
<maxSizeRollBackups value="50" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d] [%t] %-5p [%m]%n" />
</layout>
生成されるログの形式は次のとおりです。IWSGServices[8977]-23.03.15.14.log
上記の例では、プロセス ID 8977 の 1400 時間のログです。1500 で、使用中のプロセス ID と新しい時間スタンプごとに新しいログが生成されます。
log4net デバッグ モードでロギングが停止すると、次のエラーが何度も発生します。
log4net:ERROR [LogAppender] Failed to write [].
System.ArgumentOutOfRangeException: Count cannot be less than zero.
Parameter name: count
at System.String.CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)
at System.IO.StreamWriter.Write(String value)
at log4net.Util.QuietTextWriter.Write(String value)
log4net内でこのエラーの同様のケースを見つけていないため、使用例は限られています. I/O に何らかの問題があるか、log4net (少なくともこの古いバージョン) が私の使用例を満たすことができないと思われます。ただし、最新バージョンがいずれかになるとは確信していません。新しいバージョンとキャッスル コアの実装で報告された問題のため、log4net はまだアップグレードしていません。
StaticLogFileName=true を設定すると、日付スタンプなしでファイル名が作成されます。つまり、WSGServices[8699] で、正時に IWSGServices[8977]-23.03.15.14.log に名前が変更されます。これは、これを新しいファイルと見なして再度解析するログ リーダーがあるため、ファイルの名前を変更したくないためです。
ロック モデル、ローリング スタイル、日付パターンの有無を含め、多数の組み合わせを試しましたが、上記の構成が最も近いようです。1 分ごとにロールする場合、この構成が機能する可能性がありますが、これにより 1 日あたり 3000 を超えるログ ファイルが生成され、実用的ではありません。
私が使用している現在のバージョンの log4net でこれを実現したいのですが、2.11 にパッチを適用すると、PreserveLogFileNameExtension パラメータの設定がありますが、ファイルの名前は変更されますが、拡張子の後ではありません。
私が見た 1 つの提案は、IIS プール設定の Disable Overlap Recycle を false に設定することでしたが、アプリ プールのリサイクルでのみ機能するため、これは何の違いもありませんでした。
別の方法として、各アプリケーション プールからの両方のプロセスを 1 つのログ ファイルに記録することもできますが、書き込みの量が多いため、この解決策はさらにプロセスの衝突がなければ機能しないと思います。
私が何かを見逃した場合、または誰かが現在またはそれ以降のlog4netバージョンでこれを使用している場合は、助けていただければ幸いです。