我正在实现一个自定义的服务器端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()
写的。
我不希望主题和跟踪级别成为一个日志行,而消息要成为另一个日志行。还有其他方法可以确保将这些输出一起输出到日志记录服务吗?
答案 0 :(得分:1)
解决方案是覆盖所有TraceListener
Trace*()
方法,而不是Write()
和WriteLine()
方法。这使我不仅可以访问单个字符串。