查询过去两周的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
我不得不将&lt;
和&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<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事件日志的主要内容,如果未能解决你的问题,请参考以下文章