使用一个日志应用程序块日志文件的多个进程

时间:2011-08-03 16:13:06

标签: iis asp.net-2.0 enterprise-library logging-application-block

我们在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

应用程序生成了几个日志文件,所有类型都是“滚动平面文件跟踪侦听器”

有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:5)

最初来自:http://ykm001.springnote.com/pages/6348311?print=1(现在是重定向到游戏网站的死链接):

已知问题

GUID可能会添加到日志文件的文件名之前 RollingFileTraceListener实例“拥有”它正在写入的日志文件和 在写入第一个日志条目时将其锁定以进行独占写访问。它 保持文件锁定,直到实例处理完毕。如果另一个 创建指向同一文件的RollingFileTraceListener实例, 在处置第一个实例之前,第二个实例无法打开它 用于写入的文件,并将写入带有GUID的新文件 名。

RollingFileTraceListener间接派生自 System.Diagnostics.TextWriterTraceListener。此类将文件名更改为 无法写入具有指定文件名的文件时包含GUID。 这是因为RollingFileTraceListener间接调用EnsureWriter 基类TextWriterTraceListener上的方法。 .NET Reflector显示了这一点 System.Diagnostics.TextWriterTraceListener.EnsureWriter()的代码 System.dll(略微改写以提高清晰度):

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

也许我应该看看替代的日志记录机制