Gor*_*son 3 iis enterprise-library asp.net-2.0 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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我们将IIS中的工作进程数增加到1以上时,日志文件会添加一个唯一的GUID,如下所示:
068aa49c-2bf6-4278-8f91-c6b65fd1ea3aApplication.log
应用程序生成的几个日志文件都是"Rolling Flat File Trace Listener"类型
有办法避免这种情况吗?
最初来自:( http://ykm001.springnote.com/pages/6348311?print=1现在是重定向到游戏网站的死链接):
已知问题
GUID可以添加到日志文件的文件名之前RollingFileTraceListener实例"拥有"它正在写入的日志文件,并在写入第一个日志条目时将其锁定以进行独占写访问.它会保持文件锁定,直到实例处理完毕.如果创建了另一个指向同一文件的RollingFileTraceListener实例,则在放置第一个实例之前,第二个实例无法打开此文件进行写入,并将写入一个前缀为其名称的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 );
}
Run Code Online (Sandbox Code Playgroud)
基本上它似乎是一个已知的问题,有一个解决方法
http://entlibcontrib.codeplex.com/workitem/7472
使用NoGUIDRollingFlatFileListener没有帮助,问题仍然存在(即使花了很长时间重新编译日志应用程序块).它可能在EntLib 4中可以修复,但我坚持使用Ent Lib 3.1
也许我应该看看替代的日志记录机制
| 归档时间: |
|
| 查看次数: |
2176 次 |
| 最近记录: |