我正在尝试将我的.Net Windows服务转到自定义事件日志。我正在使用EventLogInstaller
在安装应用程序时创建事件日志和源代码。我读了here,Windows注册源需要一段时间,所以他们建议您在尝试写入日志之前重新启动应用程序。
由于这是Windows服务,我不想强制重启计算机或让用户手动启动服务,因此我使用此代码等待日志存在,然后自动启动服务
while (!(EventLog.Exists("ManageIT") || EventLog.SourceExists("ManageIT Client Service")))
{
Thread.Sleep(1000);
}
System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("ManageIT.Client.Service");
controller.Start();
我的问题是来自服务的事件仍然写入应用程序日志,虽然我可以在注册表编辑器中看到我的自定义日志,但它不会显示在Windows 7事件查看器中。
非常感谢任何帮助。
答案 0 :(得分:5)
默认情况下,安装服务时,源会与应用程序日志关联。 如果我们稍后更改此关联,则系统需要重新启动。
但是,我们可以通过在服务类(从servicebase继承的类)构造函数中将autolog属性设置为false来阻止服务与应用程序日志的关联。 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.autolog.aspx
答案 1 :(得分:3)
试试这个代码段:
edit - 告诫:如果运行代码的用户没有管理员权限,则会抛出异常。由于这种情况(如果用户不具备这些权限),最佳做法应该是假设日志存在,并简单地写入它。请参阅:The source was not found, but some or all event logs could not be searched
if (!EventLog.SourceExists("MyApplicationEventLog"))
{
EventSourceCreationData eventSourceData = new EventSourceCreationData("MyApplicationEventLog", "MyApplicationEventLog");
EventLog.CreateEventSource(eventSourceData);
}
using (EventLog myLogger = new EventLog("MyApplicationEventLog", ".", "MyApplicationEventLog"))
{
myLogger.WriteEntry("Error message", EventLogEntryType.Error);
myLogger.WriteEntry("Info message", EventLogEntryType.Information);
}
答案 2 :(得分:1)
听起来你正在写这样的事件日志:
EventLog.WriteEntry("Source", "Message");
这将写入应用程序日志。
如果您在创建myLogger时使用simons post中的代码,则可以指定日志的名称。
答案 3 :(得分:0)
我做了类似的事情:
var logName = EventLog.LogNameFromSourceName("MyApp", Environment.MachineName);
//delete the source if it associated with the wrong Log
if (!string.IsNullOrEmpty(logName) & logName != "MyLog")
{
EventLog.DeleteEventSource("MyApp", Environment.MachineName);
}
if (!EventLog.SourceExists("MyApp"))
{
EventLog.CreateEventSource("MyApp", "MyLog");
}