【问题标题】:Query EventLog on Windows Server 2003 using C#使用 C# 在 Windows Server 2003 上查询 EventLog
【发布时间】:2012-12-18 13:42:50
【问题描述】:

我现在正在构建一个 Windows 事件日志查看器,我们有很多 Window Server 2003 盒子。我正在使用 EventLogReader 类进行查询,但它需要 Vista+,因此无法在 Windows Server 2003 上运行。虽然 EventLog 类可用但速度很慢。我还有其他选择吗?

更新:我不是在查询所有事件日志,而是在一个日期范围内查询事件日志,鉴于我们只需要事件日志属于某个范围,有没有办法让它更快?现在使用 EventLog 类即使对于本地盒子也非常慢,对于远程盒子来说是无法忍受的。

【问题讨论】:

  • 除非您要构建比日志查看器更复杂的东西,否则使用 Log Parser Studio (blogs.technet.com/b/exchange/archive/2012/03/07/…) 等开箱即用的东西怎么样
  • @SrikanthVenugopalan,我不知道,我们有两个要求,#1,它必须支持 Win Server 2003,查询和运行,这就是我坚持使用 EventLog 类的原因,因为 EventLogReader 是Win Server 2003 #2 不支持,需要同时查询多台服务器 Log Parser Studio 可以满足这两者吗?
  • @SrikanthVenugopalan,我试过了,Log Parser Studio 似乎只适用于日志文件,而不适用于本地系统或远程服务器。虽然这个工具非常有用,但它不是我们需要的。但无论如何,谢谢。

标签: c# .net windows-server-2003 event-log


【解决方案1】:

EventLog 类很慢。访问速度取决于事件日志的大小。在大多数服务器场景中,它们被允许在归档之前变得相当大。原生 Windows 事件查看器还支持远程日志查看,让您可以演示远程日志查看的速度有多慢。

我认为 EventLog 的 Entries 属性很可能是按日期排序的。这意味着您可以实现条目的二进制搜索(Linq 默认情况下不这样做)以加快速度。这是一个二分搜索扩展的示例:Can LINQ use binary search when the collection is ordered?

【讨论】:

  • 我发现,Entries 集合并没有完全按时间排序,而是按日期分组并按日期排序。有了你的提示,我可以将性能提高一个数量级
【解决方案2】:

我刚刚和logparser 玩了一场。我之前建议的 Log Parser Studio 是用于这些任务集的 UI。

这是一个日志解析器查询:

logparser.exe -i:EVT “SELECT TimeGenerated,EventID,EventType,EventTypeName,EventCategory,EventCategoryName,SourceName,
Strings,ComputerName,SID,Message FROM \\servername\Application WHERE TimeGenerated > ’2012-07-12 00:00:00′ AND EventType IN (1;2) ORDER BY TimeGenerated DESC” -o:CSV -q:ON -stats:OFF >> c:\temp\Events.csv

用您的服务器详细信息替换“\servername\Application”。

-i:EVT 告诉它查询事件日志。

这是我使用的快速LogParser reference

【讨论】:

    【解决方案3】:

    如果Which approach is better to read Windows Event log in C#? WMI or EventLog 或与Which approach is better to read Windows Event log in C#? WMI or EventLog 相关,这可能是重复的。

    除了上述链接提供的信息外,请考虑在日志文件事件翻转之前限制信息量。

    【讨论】:

    • 好的,我承认这两者是相关的,我会改写一下以使我的问题更清楚
    【解决方案4】:

    您可以查看我为 logparser 编写的 tool。它有一个类似 SQL 的创建屏幕,可以为您提供可以使用的很好的查询示例。

    如果您在应用程序中包含 LogParser,请注意如何部署它:logparser binaries distribution,您可以看到我单独包含它。

    #1 为什么我坚持使用 EventLog 类,因为 EventLogReader 不是 Win Server 2003 支持

    我建议你直接借用Visual Log Parser的代码。

    #2 需要同时查询多台服务器

    LogParser 非常适合查询多个服务器和多个日志。查看所有日志组合并按时间排序甚至按出现分组非常方便。

    #3 我不是在查询所有的事件日志,而是在查询事件 登录一个日期范围,有没有办法让它更快,因为我们 只需要事件日志属于一个范围?

    是的,LogParser 完全在飞行中,比疾驰的火车还快!以下是按 DateRange 查询 Evt 日志的方法:

    SELECT Extract_FileName(EventLog) AS EventLog, RecordNumber, TimeGenerated, EventID, EventType, EventTypeName, EventCategoryName, SourceName, ComputerName, Message FROM
    \\servername\Application
    WHERE TimeWritten > '2011-01-25 12:01:00'
    AND TimeWritten < '2012-01-25 12:01:00'
    

    #4 我试过了,Log Parser Studio 似乎只适用于日志 文件,不在本地系统或远程服务器上。

    Log Parser Studio 只是 logparser 的 GUI,它应该可以工作,试试这个原始查询(没有 LP Studio 直接使用 LogParser)来获取你域中的所有日志:

    LogParser "SELECT SourceName,TimeGenerated,TimeWritten,Message INTO filename.csv FROM \\Server\Application where Message Like '%mydomain.com%'" -o:CSV
    

    【讨论】:

    • 优秀的答案。但我想做的是以编程方式查询,而不是使用某些工具。但我还是会检查一下。
    • 成功了,谢谢。现在的性能在旧系统上要好得多
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多