【问题标题】:How to write to a custom event log?如何写入自定义事件日志?
【发布时间】:2010-05-23 14:01:59
【问题描述】:

我正在尝试让我的 .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 事件查看器中。

任何帮助将不胜感激。

【问题讨论】:

  • 你解决过这个问题吗?我这里也发生了同样的事情。
  • 是的,我也是。而且我越来越生气了。
  • @Liam 可能但我之前问过 :)
  • 谁先问并不重要。更多的是关于哪个问题的答案最好等。

标签: c# .net windows-services event-log


【解决方案1】:

默认情况下,安装服务时,源会与应用程序日志相关联。 如果我们稍后更改此关联,系统需要重新启动。

但是,我们可以通过在服务类(继承自 servicebase 的类)构造函数中将 autolog 属性设置为 false 来阻止服务与应用程序日志的关联。 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.autolog.aspx

【讨论】:

  • 这就是我的答案。我在应用程序下不正确地创建了日志,我删除并正确地重新创建了它,但它仍然写入应用程序。我重新启动把它理顺了。
【解决方案2】:

试试这个 sn-p:

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

【讨论】:

  • 这只是写入事件日志的标准方式。我的问题是,即使我创建了自定义事件日志。我编写的事件仍然会进入应用程序日志,而不是我的自定义日志。即使使用 EventLog eventLog = new EventLog("ManageIT"); eventLog.Source = "ManageIT 客户端服务";
  • @Marko,虽然已经获得批准,但我真的觉得编辑应该是评论或其他答案。这不是问题上接受的第一个也不是最后一个“坏”答案。仅仅因为一个问题有一个被接受的答案,它并不意味着它是不可回答的。
  • @Khez 我被标记为编辑,因为我查看了其他人的编辑并明确了添加的内容 - 尽管我同意这是一个评论的情况。
  • 我肯定认为我将它包含在标准的 edit [/edit] 括号中,但我想不是。谢谢解决这个问题..我编辑了答案,因为我无法添加评论,并添加了另一个重复的答案,只有一个额外的警告很可能不会被标记为答案,因为它太旧了似乎是一个愚蠢的想法,并且可能遇到抱怨我应该编辑答案的人(以前发生过)..
  • 专注于 TheDuke 的问题(第一条评论)伙计们,因为我现在也面临着这个问题。谢谢。
【解决方案3】:

听起来您正在像这样写入事件日志:

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

这将写入应用程序日志。

如果你使用simons post中的代码来创建myLogger,你可以指定Log的名称。

【讨论】:

    【解决方案4】:

    我做了这样的事情:

            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 的行为会导致操作系统枚举可用日志,当它点击“安全”日志时,您将收到非提升用户的错误
    • 很高兴知道。谢谢!到目前为止,我还没有遇到过这种情况,因为我们拥有的服务帐户确实具有提升的权限。
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多