我花了三天时间查这个问题,但找不到一个确切的答案。我想捕获调试消息,然后将它们输出到列表日志。我正在尝试用C#来做这件事。希望社区能给我一些帮助,让我找到正确的方向。
fwzugrvs1#
当然有可能。调试输出不限于显示在“输出窗口”中。您所要做的就是编写一个自定义侦听器并将其添加到Debug.Listeners collection。您可以找到有关添加跟踪侦听器here on MSDN的完整文档。唯一需要注意的是,调试和跟踪输出的侦听器是共享的,因此如果添加一个侦听器,您将收到两种类型的消息。如果这听起来工作量太大,而您只需要一个快速而肮脏的解决方案,那么您可以从Sysinternals下载免费的DebugView utility。这个简洁的小工具是您运行的一个单独的应用程序,它监听机器上安装的所有程序的所有调试输出。如果您使用它,您甚至不需要更改应用程序中的一行代码-发送到Debug.Write的所有输出都将显示在DebugView窗口中。或者,如果您正在寻找一些长期的东西,甚至可能与您的应用程序一起发布,我鼓励您研究添加日志功能。有很多优秀的开源库提供了此功能,当您的应用部署到具有未知配置的系统时,它在现场可能是非常宝贵的。
Debug.Listeners
Debug.Write
bz4sfanl2#
就日志记录而言,Log4Net是可靠且易于使用的。您可以通过NuGet将其添加到您的项目中(如果您不知道NuGet是什么,请查看:真的很不错)。它允许你在任何你想要的地方或多或少地记录日志(控制台、文件、邮件、数据库...)网站包含很好的文档和示例。
bqjvbblv3#
你当然可以System.Diagnostics.Debug类有一个Listeners成员,它是一个全局可读/可写的侦听器集合。可以向此集合添加侦听器,以接收应用程序的所有调试输出。此外,此集合中的第一个侦听器是实际执行调试输出打印的默认侦听器。因此,通过删除该侦听器,您甚至可以抑制调试输出。下面是一个执行回调的函数,它将该回调生成的所有调试输出重定向到TextWriter.Null。你可以调整它以适应你的目的。(例如,使用一些TextWriter而不是TextWriter.Null。)
System.Diagnostics.Debug
Listeners
TextWriter.Null
TextWriter
using System.Collections.Generic; using SysIo = System.IO; using SysDiag = System.Diagnostics; static T suppressDebugOutput<T>( Sys.Func<T> function ) { Assert( SysDiag.Debug.Listeners.Count == 1 ); var originalDebugTraceListener = SysDiag.Debug.Listeners[0]; SysDiag.Debug.Listeners[0] = new SysDiag.TextWriterTraceListener( SysIo.TextWriter.Null ); try { return function.Invoke(); } finally { SysDiag.Debug.Listeners[0] = originalDebugTraceListener; } }
3条答案
按热度按时间fwzugrvs1#
当然有可能。调试输出不限于显示在“输出窗口”中。
您所要做的就是编写一个自定义侦听器并将其添加到
Debug.Listeners
collection。您可以找到有关添加跟踪侦听器here on MSDN的完整文档。唯一需要注意的是,调试和跟踪输出的侦听器是共享的,因此如果添加一个侦听器,您将收到两种类型的消息。
如果这听起来工作量太大,而您只需要一个快速而肮脏的解决方案,那么您可以从Sysinternals下载免费的DebugView utility。这个简洁的小工具是您运行的一个单独的应用程序,它监听机器上安装的所有程序的所有调试输出。如果您使用它,您甚至不需要更改应用程序中的一行代码-发送到
Debug.Write
的所有输出都将显示在DebugView窗口中。或者,如果您正在寻找一些长期的东西,甚至可能与您的应用程序一起发布,我鼓励您研究添加日志功能。有很多优秀的开源库提供了此功能,当您的应用部署到具有未知配置的系统时,它在现场可能是非常宝贵的。
bz4sfanl2#
就日志记录而言,Log4Net是可靠且易于使用的。您可以通过NuGet将其添加到您的项目中(如果您不知道NuGet是什么,请查看:真的很不错)。它允许你在任何你想要的地方或多或少地记录日志(控制台、文件、邮件、数据库...)
网站包含很好的文档和示例。
bqjvbblv3#
你当然可以
System.Diagnostics.Debug
类有一个Listeners
成员,它是一个全局可读/可写的侦听器集合。可以向此集合添加侦听器,以接收应用程序的所有调试输出。
此外,此集合中的第一个侦听器是实际执行调试输出打印的默认侦听器。因此,通过删除该侦听器,您甚至可以抑制调试输出。
下面是一个执行回调的函数,它将该回调生成的所有调试输出重定向到
TextWriter.Null
。你可以调整它以适应你的目的。(例如,使用一些TextWriter
而不是TextWriter.Null
。)