我们有一个部署到远程客户系统的C#服务。应用程序将大量“诊断”信息写入控制台(即Console.WriteLine())。该服务不是“做它应该做的事”。我们如何从另一个应用程序中的服务中捕获控制台输出?
WinForm版本可以在客户位置加载应用程序。不幸的是,它正常运作。
更新
我们可以更改服务的更改,但此时不希望进行重大更改。
我们也登录MSMQ,但仅限于“重要”事件。此服务确实与MSMQ交互以进行正常操作。或者,至少,它应该。当WinForm版本的时候,该服务似乎没有从MSMQ中提取项目。因此,编写进入控制台的消息可能会有问题。
答案 0 :(得分:30)
您是否可以更改的服务代码?如果是这样,使用Console.SetOut写入文件将是最明显的第一个调用端口。然后更改为使用适当的日志记录库进行下一个版本:)
答案 1 :(得分:12)
通常,应避免将诊断信息直接写入控制台,事件日志,MSMQ或应用程序代码中的其他位置。而是调用日志记录API,并使用配置将输出重定向到任何您想要的位置。
例如,您可以通过Trace.WriteLine(*)替换所有Console.WriteLine。然后,您可以通过修改应用程序配置文件将输出重定向到控制台,文件或其他位置:例如,要输出到控制台,请使用ConsoleTraceListener,如:
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="configConsoleListener"
type="System.Diagnostics.ConsoleTraceListener" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
在调试时,您将在控制台上获得输出 - 在您配置它的客户站点上,将跟踪输出重定向到文件,事件日志或类似内容。
更好的是,使用第三方日志框架(我建议使用Log4Net),这将为您提供比System.Diagnostics.Trace更多的选项。
(*)Trace.Write / Trace.WriteLine与Debug.Write / Debug.WriteLine相同,只是后者仅在定义了DEBUG符号时编译。因此,如果希望输出在Release版本中可用,则更喜欢Trace to Debug。
答案 2 :(得分:5)
你有很多选择;将控制台输出重定向到文件并使用正确的日志库是两个好的。这是一个中间选项:写入事件日志。
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);
然后在应用程序事件日志(管理工具 - &gt;事件查看器)中查找Source =“MyService”的条目。
答案 3 :(得分:3)
我根本不会从Window Service使用Console.WriteLine。您应该将这些错误记录到日志文件中。
执行此操作以使多个应用程序可以使用日志的另一种方法是将日志消息发布到MSMQ队列。
答案 4 :(得分:3)
使用debug.writeline并使用sysinternals debugview?
答案 5 :(得分:1)
我在MSDN上找到了this post,它将控制台输出绑定到一个富文本框,非常快速,轻松地为我工作。
它会覆盖WriteLine,并且可以扩展以覆盖其他方法。
答案 6 :(得分:1)
以下是我查看在Windows 7下运行的服务的控制台输出的方法。如果您无法修改服务的源代码以记录到文件,这可能会有所帮助。
运行services.msc并编辑服务的属性。在“登录”选项卡上,选中“允许服务与桌面交互”
使用注册表编辑器修改服务的ImagePath:转到HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [您的服务名称]并编辑ImagePath。将cmd.exe /c
附加到ImagePath字符串的开头。因此,如果原始ImagePath为c:\myService\myservice.exe
,则新的ImagePath应为cmd.exe /c c:\myService\myservice.exe
。
开始您的服务。你应该得到一个标题为“交互式服务检测”的弹出窗口。选择“查看消息”。您的屏幕应切换上下文并显示控制台窗口。完成后,单击“立即返回”按钮。
完成调试后,将ImagePath修改回原始值。然后取消选中服务属性中的“允许服务与桌面交互”复选框,然后重新启动您的服务。
警告:我只使用一项服务完成此操作,它对我有用。我不知道它是否适用于任何服务或是否会导致任何意外结果,所以我强烈建议您只在非生产环境中这样做。