我使用系统诊断向 IIS 上托管的我们的 WCF 服务添加了日志记录。
问题是它会生成许多其他文件。
这些文件是根据以下模式创建的:some_GUID_log_file_name。
我不明白我做错了什么?
更具体地说:
这不是 1 个服务/端点。我们需要准确定义 3 个肥皂 服务。
编译成1个DLL。
- 只有 1 个 web.config。
- 到目前为止,它只是为这 3 项服务中的一项添加的。
生成的文件示例:
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
网络配置
<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");
最佳答案
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
记录应用程序的某些方面。例如,您可以按层或按服务执行此操作。
关于c# - WCF 系统诊断生成带有 GUID 的附加日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673803/