Windows 服务输出未显示在事件日志中

Posted

技术标签:

【中文标题】Windows 服务输出未显示在事件日志中【英文标题】:Windows Service output not showing up in Event Log 【发布时间】: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,并且得到了输出。 【参考方案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 技巧,这将中断并等待附加调试器

以上是关于Windows 服务输出未显示在事件日志中的主要内容,如果未能解决你的问题,请参考以下文章

Server 2012 事件日志转发

nxlog.conf 过滤 Windows 事件日志问题

SQLSERVER 服务 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其他适用的错误日志

windows系统日志位置

如何防止在事件日志中截断服务异常

如何让我的服务停止自动发布到 Windows 应用程序事件日志中