当前位置:  开发笔记 > 编程语言 > 正文

如何从服务C#捕获控制台输出?

如何解决《如何从服务C#捕获控制台输出?》经验,为你挑选了3个好方法。

我们有一个部署到远程客户系统的C#服务.应用程序将大量"诊断"信息写入控制台(即Console.WriteLine()).该服务不是"做它应该做的事".我们如何在另一个应用程序中捕获服务的控制台输出?

WinForm版本可以在客户位置加载应用程序.不幸的是,它正常运作.

更新:

我们可以更改服务的更改,但此时不希望进行重大更改.

我们也登录MSMQ,但仅限于"重要"事件.此服务确实与MSMQ交互以进行正常操作.或者,至少,它应该.当WinForm版本的时候,该服务似乎没有从MSMQ中提取项目.因此,编写发送到控制台的消息可能会有问题.



1> Jon Skeet..:

您是否能够更改服务代码在所有?如果是这样,使用Console.SetOut写入文件将是最明显的第一个调用端口.然后更改为使用适当的日志库为下一个版本:)


使用Console.SetOut是一个足够小的更改,可以提供足够的信息来确定服务的问题.

2> Joe..:

通常,应避免将诊断信息直接写入控制台,事件日志,MSMQ或应用程序代码中的其他位置.而是调用日志API,并使用配置将输出重定向到您想要的任何位置.

例如,您可以通过Trace.WriteLine(*)替换所有Console.WriteLine.然后,您可以通过修改应用程序配置文件将输出重定向到控制台,文件或其他位置:例如,要输出到控制台,请使用ConsoleTraceListener,例如:


  
    
      
        
      
    
  
 

在调试时,您将在控制台上获得输出 - 在客户站点上,您将其配置为将跟踪输出重定向到文件,事件日志或类似内容.

更好的是,使用第三方日志框架(我建议使用Log4Net),它将为您提供比System.Diagnostics.Trace更多的选项.

(*)Trace.Write/Trace.WriteLine与Debug.Write/Debug.WriteLine相同,只是后者仅在定义了DEBUG符号时编译.如果希望输出在Release版本中可用,则更喜欢Trace to Debug.



3> Michael Petr..:

你有很多选择; 将控制台输出重定向到文件并使用正确的日志库是两个好的.这是一个中间选项:写入事件日志.

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

然后在Application事件日志(管理工具 - >事件查看器)中查找Source ="MyService"的条目.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有