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

时间:2016-01-20 17:21:17

标签: c# signalr signalr-hub system.diagnostics

我正在实现一个自定义的服务器端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()写的。

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

1 个答案:

答案 0 :(得分:1)

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