3

我编写了一个自定义 Windows 服务,它将数据写入自定义事件日志(在 Windows 事件查看器中)。

为了开发服务使用的商务逻辑,我创建了一个模拟 Windows 服务的启动/停止方法的 Windows 窗体。

通过 Windows 窗体执行 biz 逻辑时,信息已成功写入我的自定义事件日志。但是,当我从自定义 Windows 服务运行相同的 biz 逻辑时,信息无法写入事件日志。

需要明确的是,我已经编写了一个库 (.dll),它可以完成我希望我的自定义服务执行的所有工作 - 包括创建/写入自定义事件日志。我的表单应用程序和我的 Windows 服务一样引用了这个库。

认为问题是安全问题,我手动将自定义 Windows 服务设置为“登录”为“管理员”,但该服务仍然没有写入事件日志。

我被困在如何解决这个问题上,因为我在运行服务时无法调试和单步执行代码(如果有调试服务的方法,请分享)。

您对可能导致我的服务无法写入事件日志的原因有任何想法吗?

4

3 回答 3

2

我像这样使用它。可能有一些错别字。写在我的手机浏览器上...

public class MyClass
{
   private EventLog eventLog = new EventLog();

   public void MyClass()
   {
      if (!System.Diagnostics.EventLog.SourceExists("MyLogSource"))
          System.Diagnostics.EventLog.CreateEventSource("MyLogSource", "MyLogSource_Log");
      eventLog.Source = "MyLogSource";
      eventLog.Log = "MyLogSource_Log";
   }

   private void MyLogWrite()
   {
       eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
   } 

}
于 2012-06-26T18:26:17.283 回答
1

要调试正在运行的服务,您需要附加到该进程。有关步骤,请参见此处。

您还可以将参数检查添加到 Main 入口点,并拥有一个组合服务和控制台应用程序,该应用程序将基于某些标志启动。请参阅此 SO 帖子以获得一个很好的示例,但这里有一个片段:

using System;
using System.ServiceProcess;

namespace WindowsService1
{
    static class Program
    {
        static void Main(string[] args)
        {
            if (args == null)
            {
                Console.WriteLine("Starting service...");
                ServiceBase.Run(new ServiceBase[] { new Service1() });
            }
            else
            {
                Console.WriteLine("Hi, not from service: " + args[0]);
            }
        }
    }
}

如果存在任何参数,则上述以控制台模式启动应用程序,如果不存在任何参数,则以服务模式启动应用程序。当然,它可以更漂亮,但这就是开关的要点。

于 2012-06-26T18:13:22.393 回答
0

我发现了为什么我的服务没有写入事件日志。

该问题与尝试写入 EL 的代码/安全/等的任何部分无关。问题是我的服务没有成功收集写入 EL 的信息 - 因此,该服务甚至没有尝试写入日志。

现在我修复了收集数据的代码,数据已成功写入事件日志。

我愿意关闭这个问题,因为这个问题与真正的问题不符。

于 2012-06-26T19:22:13.053 回答