3

次の方法で呼び出される ASP.NET 2.0 アプリケーションでログ アプリケーション ブロックを使用します。

public class BaseLogEntry : LogEntry
{
    public void CloseLog()
    {
        try
        {
            Logger.Writer.Dispose();
        }
        catch (Exception)
        { }
    }
}

public class GeneralLogEntry : BaseLogEntry
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="message"></param>
    public GeneralLogEntry(string message) : this(message, 2) { }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="message"></param>
    /// <param name="priority"></param>
    public GeneralLogEntry(string message, int priority): base()
    {
        Categories.Add("General");
        Priority = priority;
        Severity = System.Diagnostics.TraceEventType.Information;
        Message = message;
        CloseLog();
    }
}

IIS のワーカー プロセスの数を 1 より大きくすると、ログ ファイルの先頭に次のような一意の GUID が追加されます。

068aa49c-2bf6-4278-8f91-c6b65fd1ea3aApplication.log

アプリによって生成されたいくつかのログ ファイルがあり、すべて「Rolling Flat File Trace Listener」タイプです。

これを回避する方法はありますか?

4

1 に答える 1

5

元の投稿: http://ykm001.springnote.com/pages/6348311?print=1(現在はゲーム サイトにリダイレクトするデッド リンク):

既知の問題

ログ ファイルのファイル名の前に GUID が付加される場合がある RollingFileTraceListener インスタンスは、書き込み先のログ ファイルを「所有」し、最初のログ エントリを書き込むときに排他的な書き込みアクセスのためにロックします。インスタンスが破棄されるまでファイルをロックしたままにします。同じファイルを指す別の RollingFileTraceListener インスタンスが作成された場合、最初のインスタンスが破棄される前に、2 番目のインスタンスは書き込み用にこのファイルを開くことができず、名前の前に GUID が付加された新しいファイルに書き込みます。

RollingFileTraceListener は、System.Diagnostics.TextWriterTraceListener から間接的に派生します。このクラスは、指定されたファイル名のファイルに書き込めない場合に、GUID を含むようにファイル名を変更します。これは、RollingFileTraceListener がその基本クラス TextWriterTraceListener で、EnsureWriter メソッドを間接的に呼び出すためです。.NET Reflector は、System.dll 内の System.Diagnostics.TextWriterTraceListener.EnsureWriter() の次のコードを示しています (わかりやすくするために少し書き直しています)。

try
{
    this.writer = new StreamWriter(fileNameWithPath, true, encoding1, 0x1000);
    break;
}
catch (IOException)
{
    Guid guid1 = Guid.NewGuid();
    fileName = guid1.ToString() + fileName;
    fileNameWithPath = Path.Combine(folderPath, fileName );
}

基本的には既知の問題のようですが、次の場所に回避策があります。

http://entlibcontrib.codeplex.com/workitem/7472

NoGUIDRollingFlatFileListener を使用しても解決せず、問題は引き続き発生します (ロギング アプリケーション ブロックの再コンパイルに多くの時間を費やした後でも)。EntLib 4で修正できるかもしれませんが、Ent Lib 3.1で立ち往生しています

おそらく、代替のロギングメカニズムを検討する必要があります

于 2011-08-05T13:02:08.233 に答える