【问题标题】:WCF System Diagnostics generates additional logs with GUIDWCF 系统诊断使用 GUID 生成其他日志
【发布时间】:2016-06-07 08:05:31
【问题描述】:

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

更具体:

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

  2. 它被编译成 1 个 DLL。

  3. 只有 1 个 web.config。
  4. 到目前为止,它只是为这 3 个服务中的 1 个添加的。

生成的文件示例:

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

【问题讨论】:

    标签: c# wcf iis web-config


    【解决方案1】:

    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 的新名称并重试。它这样做是因为它非常想写内容。

    这很容易发生在网络场景中,特别是在AppDomain 的启动/重新循环期间。当一个AppDomain 正在关闭但仍在记录其错误时,新的AppDomain 将启动并开始记录。这种竞争条件会导致创建带有 GUID 的日志文件。流氓病毒扫描程序也可能是其来源,以及使用锁定文件的查看器打开文件的系统工程师。

    您可能需要考虑将日志文件合并到一个文件中,而不是防止这种情况发生。
    我使用的另一个技巧是拥有多个TraceListeners 来记录应用程序的某些方面。例如,您可以按层或按服务执行此操作。

    【讨论】:

    • 感谢您的澄清。合并不是一种选择,并且多个跟踪侦听器会很困难,因为我们需要跟踪共享组件中的行为。我想我们会尝试 log4net 或其他。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多