18

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

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

更新:

我们能够更改更改服务,但此时不希望进行重大更改。

我们还记录到 MSMQ,但仅用于“重要”事件。此服务确实与 MSMQ 交互以实现其正常操作。或者,至少应该如此。当 WinForm 版本这样做时,该服务似乎没有从 MSMQ 中提取项目。因此,编写发送到控制台的消息可能会有问题。

4

7 回答 7

30

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

于 2008-10-14T15:21:10.027 回答
12

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

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

<configuration>
  <system.diagnostics>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add name="configConsoleListener"
             type="System.Diagnostics.ConsoleTraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
 </configuration>

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

更好的是,使用 3rd 方日志框架(我推荐 Log4Net),它会为您提供比 System.Diagnostics.Trace 更多的选项。

(*) Trace.Write/Trace.WriteLine 与 Debug.Write/Debug.WriteLine 相同,只是后者仅在定义了 DEBUG 符号时才编译。因此,如果您希望输出在 Release 版本中可用,请首选 Trace 而不是 Debug。

于 2008-10-14T16:52:13.227 回答
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);

然后在 Source = "MyService" 的应用程序事件日志(管理工具 -> 事件查看器)中查找条目。

于 2008-10-14T16:07:22.833 回答
3

我根本不会从窗口服务中使用 Console.WriteLine。您可能应该将这些错误记录到日志文件中。

执行此操作以便多个应用程序可以使用日志的另一种方法是将日志消息发布到 MSMQ 队列。

于 2008-10-14T15:26:19.970 回答
3

使用 debug.writeline 并使用 sysinternals debugview?

于 2008-10-14T15:28:59.590 回答
1

我在 MSDN 上发现了这篇文章,它将控制台输出绑定到富文本框,对我来说非常快速和轻松。

它覆盖了 WriteLine,并且可以扩展以覆盖其他方法。

于 2009-07-08T09:44:13.577 回答
1

以下是我查看在 Windows 7 下运行的服务的控制台输出的方式。如果您绝对无法修改服务的源代码以登录到文件,这可能会有所帮助。

  1. 运行 services.msc 并编辑服务的属性。在“登录”选项卡上,选中“允许服务与桌面交互”

  2. 使用注册表编辑器修改服务的 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.

  3. 开始您的服务。您应该会看到一个名为“交互式服务检测”的弹出窗口。选择“查看消息”。您的屏幕应该切换上下文并显示控制台窗口。完成后,单击“立即返回”按钮。

  4. 完成调试后,将 ImagePath 修改回其原始值。然后取消选中服务属性中的“允许服务与桌面交互”复选框并重新启动服务。

警告:我只使用一项服务完成了此操作,它对我有用。我不知道它是否适用于任何服务或是否会导致任何意外结果,因此我强烈建议您仅在非生产环境中执行此操作。

于 2015-11-19T16:45:48.453 回答