c# - WCF 系统诊断生成带有 GUID 的附加日志

标签 c# wcf iis web-config

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

更具体地说:

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

  2. 编译成1个DLL。

  3. 只有 1 个 web.config。
  4. 到目前为止,它只是为这 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/

相关文章:

c# - 自动完成 : Asynchronous population with WCF using threads

java - Java 使用的 WCF - java.lang.NullPointerException

wcf - 使用 WCF 服务创建自定义 WS-Federation 身份提供程序

Http header -缓存控制 : max-age - behaviour?

iis - IIS在Powershell中启用HTTP保持事件状态

javascript - TinyMCE - 未捕获的异常 : module [5] returned undefined when using local javascript file

c# - 是否可以在 C# 中扩展数组?

c# - 无法访问 C# emgucv 中的 Image<Bgr, byte>.Data 属性

c# - 抽象方法是否有显式的接口(interface)声明?

c# - 在扩展方法 (C#) 中获取类型成员的简单语法