【问题标题】:Query windows event log for the past two weeks查询过去两周的windows事件日志
【发布时间】: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; 替换为实际符号,否则会出现语法错误。此命令产生空输出。

【问题讨论】:

    标签: windows windows-7 cmd windows-server-2008-r2 event-log


    【解决方案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 选项卡以生成结构化查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多