WCF系统诊断程序使用GUID生成其他日志

时间:2016-06-07 08:05:32

标签: c# wcf iis web-config

我使用系统诊断功能将记录添加到IIS上托管的我们的WCF服务。
问题是它生成了许多其他文件。
这些文件是根据模式创建的: some_GUID_log_file_name。
我不明白我做错了什么?

更具体一点:

  1. 这不是1个服务/端点。我们需要准确定义3个肥皂 服务队。

  2. 它被编译成1个DLL。

  3. 只有1个web.config。
  4. 到目前为止,这3项服务只增加1。
  5. 生成的文件示例:

    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");
    

1 个答案:

答案 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记录应用程序的某些方面。例如,您可以按层或按服务执行此操作。