我使用系统诊断功能将记录添加到IIS上托管的我们的WCF服务。
问题是它生成了许多其他文件。
这些文件是根据模式创建的: some_GUID_log_file_name。
我不明白我做错了什么?
更具体一点:
这不是1个服务/端点。我们需要准确定义3个肥皂 服务队。
它被编译成1个DLL。
生成的文件示例:
19c2274c-56d1-4260-8efc-95fe9a3ca7bctracelog.log
1f7acecf-b2f9-48da-80d4-97014acd3119tracelog.log
45955050-6b7b-4a7d-9ec8-be751ded437ctracelog.log
5fb4f509-0e6d-4ee7-ab20-66f9bfbf31aftracelog.log
a57f9c35-62b4-491e-8db8-354cd6c40cectracelog.log
ec9ba7c6-2dc3-4761-89cf-9f4f421444fatracelog.log
tracelog.log
Web.conifg
<source name="TraceLog" switchValue="All">
<listeners>
<add name="textfileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="logs\tracelog.log" />
</listeners>
</source>
在应用程序中初始化TraceSource。
private static TraceSource _traceSource = new TraceSource("TraceLog", SourceLevels.All);
...
_traceSource.TraceEvent(TraceEventType.Information, 10, "some trace");
答案 0 :(得分:2)
GUID是TextWriterTraceListener
的一项功能。在尝试写入文件之前,它会调用内部方法EnsureWriter
。如果您使用ILSpy查看它,您将找到此实现:
for (int i = 0; i < 2; i++)
{
try
{
this.writer = new StreamWriter(path, true, encodingWithFallback, 4096);
flag = true;
break;
}
catch (IOException)
{
text = Guid.NewGuid().ToString() + text;
path = Path.Combine(directoryName, text);
}
catch (UnauthorizedAccessException)
{
break;
}
catch (Exception)
{
break;
}
}
此代码尝试为配置的文件名创建StreamReader
。如果失败,例如因为文件已打开,则会生成带有GUID的新名称并重试。这样做是因为它非常想写内容。
在Web场景中很容易发生这种情况,特别是在AppDomain
的启动/重新循环期间。当一个AppDomain
正在关闭但仍记录其错误时,新AppDomain
启动并开始记录。该竞争条件导致使用GUID创建日志文件。流氓病毒扫描程序也可以作为其来源,以及使用锁定文件的查看器打开文件的系统工程师。
您可能需要考虑将日志文件合并到一个文件中,而不是阻止这种情况发生
我使用的另一个技巧是让多个TraceListeners
记录应用程序的某些方面。例如,您可以按层或按服务执行此操作。