我的自定义Windows服务没有写入我的自定义事件日志

时间:2012-06-26 18:10:11

标签: c#-4.0 windows-services custom-eventlog

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

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

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

为了清楚起见,我编写了一个库(.dll)来完成我希望自定义服务执行的所有工作 - 包括创建/写入自定义事件日志。 My Form应用程序和我的Windows服务一样引用此库。

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

我一直坚持如何解决这个问题,因为我在运行服务时无法调试并进入代码(如果有办法调试服务,请分享)。

您是否有任何想法可能导致我的服务无法写入事件日志?

3 个答案:

答案 0 :(得分: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);
   } 

}

答案 1 :(得分:1)

要调试正在运行的服务,您需要附加到流程。 See here for the steps.

您还可以将参数检查添加到主入口点,并具有基于某个标志启动的组合服务和控制台应用程序。请参阅this SO post for a good example,但这是一个片段:

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]);
            }
        }
    }
}

如果存在任何参数,则上述以控制台模式启动应用程序,如果没有参数,则以服务模式启动应用程序。当然它可以更加发达,但这是转变的要点。

答案 2 :(得分:0)

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

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

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

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