查询过去两周的windows事件日志

Posted

技术标签:

【中文标题】查询过去两周的windows事件日志【英文标题】:Query windows event log for the past two weeks 【发布时间】:2012-10-06 15:11:54 【问题描述】:

我正在尝试导出 Windows 事件日志,但不是根据数量而是根据记录事件的时间来限制导出的事件。我正在尝试在 Windows 7 及更高版本上执行此操作。到目前为止,我的工作重点是使用 wevtutil。

我正在使用 wevtutil,我的命令行现在是:wevtutil Application events.evtx 这里的问题是我导出了整个日志,这可能非常大,所以我想将其限制为最近 2 周。

我找到了this 帖子,但首先它似乎没有在我的系统上产生任何输出(是的,我已经更改了日期和时间),其次它似乎取决于我尝试使用的日期格式避免。

这是我运行的修改后的命令:

wevtutil qe Application "/q:*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text

我不得不将&amp;lt;&amp;gt; 替换为实际符号,否则会出现语法错误。此命令产生空输出。

【问题讨论】:

【参考方案1】:

我强烈建议使用LogParser 来完成此类任务:

logparser -i:evt file:query.sql

query.sql 包含这样的内容:

SELECT
  TimeGenerated,EventID,SourceName,Message
FROM Application
WHERE TimeGenerated > TO_TIMESTAMP(SUB(TO_INT(SYSTEM_TIMESTAMP()), 1209600))
ORDER BY TimeGenerated DESC

有点不直观的日期计算将系统时间 (SYSTEM_TIMESTAMP()) 转换为整数 (TO_INT()),减去 1209600 秒(60 * 60 * 24 * 14 = 2 周)并将结果转换回时间戳 ( TO_TIMESTAMP()),从而产生 2 周前的日期。

您可以通过将固定秒数替换为MUL(86400, $days) 并将命令行更改为以下方式来参数化时间跨度:

logparser -i:evt file:query.sql+days=14

您也可以将查询直接传递给 logparser:

logparser -i:evt "SELECT TimeGenerate,EventID,SourceName,Message FROM ..."

【讨论】:

如果可能,我想避免使用不属于标准 Windows 发行版的其他可执行文件。 您可以将 LogParser 可执行文件和 DLL 复制到您选择的位置并从那里运行它,但这当然是您的决定。【参考方案2】:

我不知道您对 PowerShell 的看法,但它在您标记的所有系统上都可用。

在 powershell 提示符下,请参阅 Get-Help Get-EventLog -Examples 了解更多信息。

如果您必须从 .cmd 或 .bat 文件执行此操作,则可以调用 powershell.exe -File powershell_script_file_name

其中 powershell_script_file_name 包含您需要的 Get-EventLog 命令。

这个例子给出了所有的安全事件日志失败,我用它来审计系统:

Get-EventLog -LogName security -newest 1000 | where $_.entryType -match "Failure"

【讨论】:

由于我想将其合并到我们正在开发的产品中随附的脚本中,因此我们希望避免依赖于 powershell(法律和许可问题)。【参考方案3】:

问题是由于 /q: 在引号内。它应该在外面,比如:

wevtutil qe Application /q:"*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text

这对我来说很好用。

【讨论】:

仍然不适合我。此命令再次产生空输出。 这一次,你一定忘记输入正确的日期了。我将它复制粘贴到命令行中,固定日期,它工作。另外,我已经在我们的崩溃诊断系统的代码中实现了它,它工作得很好。【参考方案4】:

对于过去 2 周的事件,您还可以使用timediff,以避免硬编码日期。

Windows 使用毫秒,因此它将是 1000 * 86400(秒,= 1 天)* 14(天)= 1209600000。

对于您的查询,看起来像

wevtutil qe Application /q:"*[System[TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /c:1

我在示例中添加了/c:1 以仅获取 1 个事件,因为过去 2 周内有很多事件。

您可能还想只列出警告和错误。为此,您可以使用(Level=2 or Level=3)。 (出于某种原因,Level&lt;4 在 Win7 上似乎不适合我)

wevtutil qe Application /q:"*[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /c:1

【讨论】:

您可能还想包含重要消息:Level=1 or Level=2 or Level=3。要以图形方式构建查询,您可以使用事件查看器:在“操作”窗格或“操作”菜单中,单击“过滤当前日志”。选择所需的日志记录选项。单击 XML 选项卡以生成结构化查询。

以上是关于查询过去两周的windows事件日志的主要内容,如果未能解决你的问题,请参考以下文章

nxlog.conf 过滤 Windows 事件日志问题

powershell PowerShell:使用QueryList过滤器查询Windows事件日志

如何在 Hadoop Hive 中执行“事件顺序”查询?

Windows日志记录系统事件的日志

Syslog和Windows事件日志收集

Windows.old 事件查看器日志