我们在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
应用程序生成了几个日志文件,所有类型都是“滚动平面文件跟踪侦听器”
有没有办法避免这种情况?
答案 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
也许我应该看看替代的日志记录机制