0

log4net がマルチプロセスで安全でないという問題を回避しようとしています。ログ ファイルがロックされ、同じアプリケーションの別のスレッドが書き込めなくなることがあるためです。私がやろうとしているのは、そのスレッドに一意の ID を持つログ ファイルを作成することです。現在、ファイル名の一部として Thread.CurrentThread.GetHashCode()、Process.GetCurrentProcess()、および System.Environment.MachineName を使用しています。これで十分ですか、それとも冗長ですか、それともログ ファイル名としてマルチスレッド/プロセス/Web ファーム/Web ガーデンに安全な一意の ID を取得するより良い方法はありますか? または、ログ ファイルを書き込むためのより良い方法はありますか? 前もって感謝します。

4

2 に答える 2

1

一般的な理論として: マシン ID (ホスト名、または最初のネットワーク インターフェイスの MAC アドレス) とプロセス ID / スレッド ID は普遍的に一意である必要があるため、有効な解決策があると思います。

MAC アドレスは、普遍的に一意であることが「保証されている」ため、取得できれば素晴らしいものです (ただし、仮想化によってそれが破られる可能性があります)。ホスト名は「一意である必要があります」が、その保証は少しあります (たとえば、誰かが一連のクローン マシンを立ち上げ、誤ってホスト名をすべて一致するように設定します)。ただし、一意のホスト名が保証されている何らかの種類の Windows ドメインで実行していると思います (asp.net のタグが付けられているため)。

于 2011-12-01T22:05:11.250 に答える
1

私の理解が正しければ、マシンごと、プロセスごと、スレッドごとに 1 つのログ ファイルを作成する必要があります。したがって、何を行っているかを説明すると、ログ ファイル名は次のようになります。

machine1_processid1_thread1.log
machine1_processid1_thread2.log
machine1_processid2_thread1.log
machine2_processid1_thread1.log
etc...

ログ ファイル名の構成要素の実際の値を気にしますか? つまり、ログ ファイル名が識別可能なコンポーネント (マシン名、スレッド ID、プロセス ID など) で構成されていることは本当に重要なのでしょうか? それとも、ログ ファイル名が一意であるだけで十分ですか?

1 つのアプローチは、単純に Guid を使用することです。したがって、ログ ファイル名を作成している場合は、次のようにすることができます。

string logFileName = Guid.NewGuid().ToString() + ".log"

これにより、ログ ファイルに一意の名前を付けるという目標が達成される可能性があります。最終的に Guid の衝突が発生する可能性はあると思いますが、それについて確実に言えるほどのことは知りません。しかし、このアプローチはあまりユーザーフレンドリーではありません。GUID ベースのファイル名でいっぱいのフォルダを見て、本当に見たいファイルを特定しようとする人がいるでしょうか?

ログを生成しているマシンとプロセスを知ることは役に立つでしょうか? そうすれば、問題が特定のマシンまたは特定のプロセスから発生していることを知っていた、または疑って​​いる場合、そのマシン/プロセスから生成されたファイルだけを見つけることができます。その場合、引き続き Guid を使用してファイルに名前を付けることができますが、マシン名やプロセスを追加することもできます。

string logFileName = string.Format("{0}_{1}_{2}.log", 
                                   Environment.MachineName,
                                   Process.GetCurrentProcess().ProcessName,
                                   Guid.NewGuid());

これにより、ログ ファイル名がもう少しユーザー フレンドリになり、すべての基準で一意になるはずです。

要約すると、Guid の使用を試みることをお勧めします。その目的は、独自のアルゴリズムを考え出すのではなく、グローバルに一意の識別子を提供することであるからです。上で述べたように、主な欠点は、GUID ベースのログ ファイルでいっぱいのフォルダーを調べて、「適切な」ログ ファイルを見つけようとするのが煩わしいことです。マシン名、プロセス名など、よりユーザーフレンドリーなデータでファイル名を拡張すると役立つ場合があります。

最後に、Guid を使用する場合、GUID の書式設定に使用できるオプションがいくつかあることに言及します。

http://msdn.microsoft.com/en-us/library/97af8hh4.aspx

于 2011-12-02T16:38:28.013 に答える