如何写入自定义事件日志?

4
我正在尝试让我的.Net Windows服务写入自定义事件日志。我使用EventLogInstaller在应用程序安装时创建事件日志和源。我在这里读到,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事件查看器中。
任何帮助将不胜感激。

1
你解决过这个问题吗?我这里也遇到了同样的情况。 - Rohan West
是的,我也是。而且我越来越生气了。 - Mitulát báti
可能是写入Windows应用程序事件日志的重复问题。 - Liam
@Liam 可能是,但我之前已经问过那个了 :) - TheDuke
谁先问的并不是很重要。更重要的是哪个问题有最好的答案,等等。 - Liam
4个回答

6

这对我来说是答案。我错误地在应用程序下创建了日志,我将其删除并正确地重新创建,但它仍然写入应用程序。我重新启动后解决了问题。 - Mark

4
尝试这段代码:

编辑 - 注意:如果运行此代码的用户没有管理员权限,则会抛出异常。由于这种情况(如果用户将不拥有这些权限),最佳实践是假定日志已存在,并简单地写入它。请参阅: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
这只是写入事件日志的标准方式。我的问题是,即使我已经创建了自定义事件日志,我写入的事件仍然进入应用程序日志,而不是我的自定义日志。即使使用以下代码: EventLog eventLog = new EventLog("ManageIT"); eventLog.Source = "ManageIT Client Service"; - TheDuke
@Marko,虽然已经批准,但我认为这次编辑应该是一个评论或另一个答案。这并不是第一个也不会是最后一个在问题上被接受的“糟糕”答案。仅仅因为一个问题有一个被接受的答案,并不意味着它不可回答。 - Khez
@Khez 我被标记为编辑,因为我审查了别人的编辑并清楚地说明了添加了什么内容 - 尽管我同意这可以作为一条评论。 - marko
我本以为我已经用标准的[edit] [/edit]括号包裹起来了,但似乎并没有。谢谢你修复它。我编辑了答案是因为我无法添加评论,并且添加另一个重复的答案,只有一个额外的警告,最有可能不会被标记为答案,因为它很老,这似乎是一个愚蠢的想法,可能会遭到人们抱怨我应该编辑答案(之前发生过)。 - JoeBrockhaus
大家注意TheDuke的问题(第一条评论),因为我现在也面临同样的问题。谢谢。 - Mitulát báti

1

听起来你是这样写入事件日志的:

 EventLog.WriteEntry("Source", "Message");

这将写入应用程序日志。

如果您使用Simons帖子中的代码创建myLogger,您可以指定日志的名称。


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

调用EventLog.SourceExists会导致操作系统枚举可用日志,当它遇到“安全”日志时,非管理员用户将会收到错误信息。 - bkwdesign
好的,谢谢!我还没有遇到过这种情况,因为我们拥有的服务账户确实具有提升的特权。 - dynamiclynk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接