【问题标题】:Windows Service output not showing up in Event LogWindows 服务输出未显示在事件日志中
【发布时间】:2011-11-24 00:16:05
【问题描述】:

我正在尝试关注这个walkthrough

我使用的是 Visual Studio 2010 Premium。

我在服务器资源管理器或事件查看器中看到的唯一事件是“服务已成功启动”。和“服务已成功停止。”

这里是服务代码:

namespace MyNewService
{
    public partial class MyNewService : ServiceBase
    {
        public MyNewService()
        {
            InitializeComponent();
            if (!EventLog.SourceExists("MySource"))
            {
                EventLog.CreateEventSource("MySource", "MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
        }

        protected override void OnStop()
        {
            eventLog1.WriteEntry("In onStop.");
        }
    }
}

【问题讨论】:

  • 您看到自己的事件日志出现还是正在查看应用程序日志?
  • 以管理员身份运行开发环境(右键单击,以管理员身份运行...)这可能是权限问题。
  • 我以管理员身份启动了 VS,并且得到了输出。

标签: c# windows windows-services event-log windows-7-x64


【解决方案1】:

我在 Win 7 64 上使用 Visual Studio 2010 Professional 时遇到了同样的问题。我新编译的服务是在 InstallUtil.exe 以管理员身份运行的情况下安装的。它正确启动和停止。没有例外,但没有多少刷新事件查看器会显示一个新的事件日志。 Fran71 的建议对我有用:我关闭了事件查看器并重新打开。瞧,新创建的应用程序日志文件出现了。

【讨论】:

  • 欢迎来到 Stack Overflow!请仅将发布答案按钮用于实际答案。在网站上投入一些时间,您将获得足够的 privileges 来为您喜欢的答案投票,这是 Stack Overflow 表达谢谢的方式。
  • 感谢 FumblesWithCode(或 Fran71,虽然在这里找不到他)。关闭和重新打开它也对我有用。
  • “Fran71”似乎等于“Jordan”
【解决方案2】:

FWIW,我在 Win8 中遇到了这个问题,发现刷新事件查看器并没有导致我新创建的事件日志出现,但是关闭并重新打开事件查看器会。让我发疯,因为在创建事件源或编写日志条目时没有抛出异常。

【讨论】:

  • 创建事件源时没有抛出异常 好吧,根据MSDN在安装应用程序期间创建新的事件源。这允许操作系统有时间刷新其已注册事件源及其配置的列表。如果操作系统尚未刷新其事件源列表,而您尝试使用新源写入事件,则写入操作将失败。 因此,至少创建事件源是异步的。
  • 这是有道理的,但是写入操作成功了,并且一旦重新打开查看器,我之前在测试时写入的所有日志都会显示在正确的位置。只是有点混乱。
  • 天哪,谢谢。我可以在应用程序日志中看到我的服务正在启动,但是直到我重新启动事件查看器后我的应用程序日志才显示出来。我今天运行的数百个测试中的每一个都完成了。 '呜咽'
【解决方案3】:

可能是权限问题。正如评论者所说,尝试以管理员身份运行 VStudio 或您编译的服务。

此外,您仍然可以调试服务 - 将 thread.Sleep(最多 20 秒)作为您的第一行(让您自己有时间附加调试器),然后在之后的行上放置一个断点。然后转到工具-> 附加到进程并选择您的.exe。如果你在 Thread.Sleep() 结束之前完成了它,那么你应该休息。

请记住,服务必须在 IIRC 30 秒内完成 OnStart,否则 Windows 会认为它没有响应并终止您的进程,因此如果您要进行大量调试,请将您的代码移出服务启动。只需在其中放置一个计时器或其他东西。

为了使调试更容易,请考虑将您的功能移至 DLL,然后将您的服务保持在足够的代码中以调用您的 DLL - 这将简化单元测试和调试 - 但不要忘记很多事情都会发生变化当您实际将其作为服务运行时。

【讨论】:

  • 您可以调用 Debugger.Launch() 而不是 Thread.Sleep 技巧,这将中断并等待附加调试器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多