【问题标题】:How to retrieve event log other than Application category?如何检索应用程序类别以外的事件日志?
【发布时间】:2015-11-12 20:07:43
【问题描述】:

我正在尝试检索与应用程序不同的类别中的一些事件日志。例如,我想获取“Microsoft-Windows-Application Server-Applications/Operational”中的信息。下面是我的代码

EventLog log = new EventLog("Microsoft-Windows-Application Server-Applications/Operational");
int index = log.Entries.Count - 1;
Debug.WriteLine(log.Entries[index].Message);

但它总是显示错误:

The event log 'Microsoft-Windows-Application Server-Applications/Operational' on computer '.' does not exist.

如果我只是使用“应用程序”,那么我可以在应用程序类别中获取日志。

如何获取“Microsoft-Windows-Application Server-Applications/Operational”的日志?

谢谢

【问题讨论】:

    标签: c# event-log


    【解决方案1】:

    EventLog 类仅允许您访问 Windows 事件日志。您需要改用 System.Diagnostics.Eventing.Reader 命名空间中的 EventLogReader

            EventLogQuery query = new EventLogQuery("Microsoft-Windows-Application Server-Applications/Operational", PathType.LogName, "*");
            EventLogReader reader = new EventLogReader(query);
            EventRecord eventRecord;
            while ((eventRecord = reader.ReadEvent()) != null)
            {
                Console.WriteLine(String.Format("{0} - {1}",
                    eventRecord.TimeCreated,
                    eventRecord.FormatDescription()));
            }
    

    【讨论】:

    • 仅访问 Windows 事件日志可能不正确。在加载 EventLog.GetEventLogs() 时,它确实显示了来自应用程序和服务日志的一些日志
    • 来源:MSDN msdn.microsoft.com/en-us/library/system.diagnostics.eventlog“EventLog 允许您访问或自定义 Windows 事件日志。”
    • 该页面需要更多定义什么是“Windows 事件日志”:) 不过没关系,只是好奇。
    【解决方案2】:

    您可能需要使用EventLogReaderEventLogQuery 来实现此目的。

    EventLogReader reader = new EventLogReader("Microsoft-Windows-Application Server-Applications/Operational");
    string message = reader.ReadEvent().FormatDescription();
    

    您可以使用 EventLogQuery 以降序检索结果。

    但是,我不太确定,为什么这不适用于 EventLog。也许其他人可以帮助澄清这一点。

    【讨论】:

      【解决方案3】:

      @MatthewG 的回答部分正确。 EventLog 类允许您按照 MSDN 中的定义访问管理日志。但它们实际上显示的是在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\ 下找到的文件夹名称

      您可以通过使用随机名称创建一个新文件夹来验证这一点,当您使用EventLog.GetEventLogs() 方法进行查询时,您会发现随机名称正在显示。有些东西,我相信Microsoft 的实现非常糟糕。

      所以你将不得不使用EventLogQueryEventLogReader 类来读取事件日志。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        相关资源
        最近更新 更多