我编写了一个自定义Windows服务,将数据写入自定义事件日志(在Windows事件查看器中)。
为了开发服务使用的商业逻辑,我创建了一个Windows窗体,它模拟了Windows服务的启动/停止方法。
通过Windows窗体执行biz逻辑时,info已成功写入我的自定义事件日志。但是,当我从自定义Windows服务运行相同的biz逻辑时,信息无法写入事件日志。
为了清楚起见,我编写了一个库(.dll)来完成我希望自定义服务执行的所有工作 - 包括创建/写入自定义事件日志。 My Form应用程序和我的Windows服务一样引用此库。
认为问题是一个安全问题,我手动将自定义Windows服务设置为“登录”为“管理员”,但该服务仍然没有写入事件日志。
我一直坚持如何解决这个问题,因为我在运行服务时无法调试并进入代码(如果有办法调试服务,请分享)。
您是否有任何想法可能导致我的服务无法写入事件日志?
答案 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的信息 - 因此,该服务甚至没有尝试写日志。
现在我修复了收集数据的代码,数据已成功写入事件日志。
我愿意关闭这个问题,因为这个问题不是真正的问题。