如何关联 SignalR Write() 和 WriteLine() 跟踪消息

How can I correlate SignalR Write() and WriteLine() trace messages

我正在实施自定义的服务器端 TraceListener 以将 SignalR 跟踪重定向到我的日志记录服务。在测试时,我使用 SignalR help page 的方向通过 web.config 实现了默认 TextWriterTraceListener。使用 traceOutputOptions="Datetime, ThreadId, ProcessId",我得到如下跟踪:

SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(504a810d-4597-4dd7-9a93-eb49e76519d3)
    ProcessId=18508
    ThreadId=11
    DateTime=2016-01-20T15:51:05.7327980Z

跟踪的第一部分是主题和跟踪级别,跟踪的后半部分是实际消息,traceOutputOptions 列在正下方并带有缩进。我在连接了多个客户端的情况下对此进行了测试,并且跟踪始终写入正确分组的文件中。

我使用博客 here 实现了我的自定义 TraceListener。我成功拦截了跟踪,但问题是来自多个 Write() 调用的单个典型消息,最后一个 WriteLine() 调用。如果我只是在每次 Write()WriteLine() 调用时将消息发送到我的日志中,它们将显示为完全独立的日志消息。简单地从我的 TraceListener 写入一个文本文件,我得到如下输出:

SignalR.Transports.LongPollingTransport Verbose: 0 : 
DrainWrites(be9bc850-1453-4c0a-b1e4-3c1ecb8b0359)
ProcessId=23604
ThreadId=7
DateTime=2016-01-20T17:04:51.3859180Z

我能看到关联这些的唯一方法是通过某种缓存调用线程 Write()WriteLine() 来跟踪它们,然后将完整消息发送到WriteLine() 上的日志服务,但前提是 WriteLine() 消息中没有 traceOutputOptions 的名字之一,因为这些也是通过 WriteLine() 写入的。

我不希望主题和跟踪级别是一个日志行,而消息是另一个。是否有任何其他方法可以确保这些将一起输出到日志记录服务?

解决方案是覆盖所有 TraceListener Trace*() 方法,而不是 Write()WriteLine() 方法。这使我不仅可以访问单个字符串。