千家信息网

Windows 日志高级筛选实践

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,背景经常需要查看日志,不仅是用来排错,有些时候我还需要监控系统来抓取特定日志来帮助减少我的工作负担,以及时监控到异常出现,并作出通知及响应,那么从大量日志中快速并精确筛选出想要的日志,并且精确提取信息
千家信息网最后更新 2026年11月02日Windows 日志高级筛选实践

背景

经常需要查看日志,不仅是用来排错,有些时候我还需要监控系统来抓取特定日志来帮助减少我的工作负担,以及时监控到异常出现,并作出通知及响应,那么从大量日志中快速并精确筛选出想要的日志,并且精确提取信息,是一个必备的技能。我曾经用内置的事件查看器的筛选器进行事件筛选,然后保存视图,或者使用powershell get-winevent 进行筛选,也使用logparser, 或者第三方的日志查看工具比如eventexplorer 进行日志筛选。但是总是遇到几个主要的问题:

  1. 从大量日志中过滤出极个别日志,每次执行的事件总是太长。

  2. 不能灵活的或者更精确的进行筛选。一般只能大概的匹配,然后再做一步处理。通常又遇到1的问题。

尝试和比较

经过一些尝试和使用,个人觉得powershell 的get-winevent 最方便,因为毕竟是一个脚本语言,可以进一步进行处理,而且可以很灵活的处理。logparser 很快,但是如果精确提取某些日志的字段,就没有那么容易了,windows 日志的EventData中的数据复杂多样,靠几个常规字段是没有办法灵活进行处理的。

论速度的话,除了logparser,使用xml 筛选是最快速的。但是xml 筛选需要使用复杂的、受限的xpath 1.0 (被微软实现后,有更多限制),虽然有点蹩脚又难懂,但是和时间节省算起,还是划的来的,特别是重复任务。

一个比较好的开始是从下面链接开始。

https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/

正式实践

一个比较常用场景是,我经常需要精确过滤到哪个账号最近锁定了,哪台计算机锁定的,什么时候。我需要很快速的能查询到锁定日志。过去虽然我用get-winevent -filterhashtable 可以做到这些,但是速度实在太慢了,虽然我的域控只有4台。我经常和用户说,如果你想知道你在哪台计算机上锁定了,请等待一段时间,我会把查询结果用邮件发给你。不过现在使用xpath 过滤时,我基本上可以在用户打电话过来时,告诉他这些信息。

下面XML 过滤AD安全日志中的最近一天的某个用户名的锁定日志

如果你只想过滤最近一天所有用户的锁定日志,那么这样写

上面过滤XML可以在 事件查看器的 筛选当前日志--》XML---》手动编辑查询中进行测验。

OK ,为了方便使用,我们做成一个powershell function ,方便日常使用,直接上例子。

function get-lockedEvent{    <#    .SYNOPSIS        Function to filter user locked event which id=4740    .DESCRIPTION        This function search user locked events in DC security logs, this function need the domain admin priv.    .EXAMPLE        get-lockedEvent -loginname oaoperator -show    .EXAMPLE        PS C:\> get-lockedEvent -loginname oaoperator -summary        Count Name        ----- ----        457 Oaoperator, OA    .EXAMPLE        PS C:\> get-lockedEvent -loginname oaoperator        Username   LockedPC Datetime           EventLocation        --------   -------- --------           -------------        Oaoperator OA       2018/9/27 10:27:40 dc02        Oaoperator OA       2018/9/27 10:32:40 dc02    #>        [cmdletbinding()]    param(        [parameter(Mandatory=$false)]        [string]        $loginname,        [Parameter(Mandatory=$false)]        [switch]        $summary,        [Parameter(Mandatory=$false)]        [switch]        $show    )# filter Locked Events generated in 1 day and username eq loginname    $f2=@'                      '@# filter Locked Events generated in 1 day     $f1=@'                      '@    if($loginname){        $f=$f2 -f $loginname    }else{        $f=$f1    }    $DCs=Get-ADDomainController -Filter *|%{$_.hostname}    $r=Invoke-Command -ComputerName $DCs -ArgumentList @($f) -Command{        param(            $filter        )        $events=Get-WinEvent -FilterXml  $filter        $events|%{            $e=[xml]$_.toxml()            [PSCustomObject]@{                'Username'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetUserName'})."#text"                'LockedPC'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetDomainName'})."#text"                'Datetime'=[datetime]$e.Event.System.TimeCreated.SystemTime                'EventLocation'=$e.Event.System.Computer            }        }    }|Sort-Object -Property Datetime |select -Property 'UserName','LockedPC','Datetime','EventLocation'    if($summary){        $r=$r|Group-Object -Property Username,LockedPC -NoElement    }        if($show){        $r|Out-GridView    }else{        $r    }}

另外一个实践

由于最近有一些计划任务的状态需要监控,而且考虑到这应该是一个非常通用的需求,所以我想过滤计划任务名称匹配\qq_ent 开头的,然后任务执行结果不为0的日志,尽管我参考着下面的一些blog 链接,也让我尝试了好一会,我想应该记录下这些过程。


我们先来看看计划任务日志的xml 内容:


     201   2   4   201   2   0x8000000000000000      144817         Microsoft-Windows-TaskScheduler/Operational   ComputerName.xxx.com        \qq_ent\store_to_db   {110529FD-DBFD-4E59-B207-83DF8CC779B8}   C:\Users\UserName\AppData\Local\Programs\Python\Python37\python3.exe   2147942401   22172     

说下我们的任务:

  1. 匹配 EventData 中Data 名称为TaskName的,它的值应该是\qq_ent\xxxx

  2. 匹配 EventData中 Data 名称为ResultCode的,它的值应该是>0 或者不等于0的

  3. EventID=201

  4. Provider Name=Microsoft-Windows-TaskScheduler

最后成型的过滤,和微软的之前的例子不一样。


                   

我之前按照微软的例子是这样写的,结果不对的。


                      

注意事项

  1. event log 中的Xpath 受限,能使用的函数有限,因此如果你想筛选字符串,你会发现starts-with contains 这些xpath 函数都不支持。尽量使用其他条件筛选,然后再使用powershell内置过滤功能进行过滤,当然这要牺牲一些处理时间。

  2. Xpath中的一些字符串要进行转义,比如你想比较一个数字,可能写Data>0,那么> 要转义成>

参考资料

https://blogs.technet.microsoft.com/heyscriptingguy/2011/01/24/use-powershell-cmdlet-to-filter-event-log-for-easy-parsing/

https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/04/data-mine-the-windows-event-log-by-using-powershell-and-xml/

https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/03/use-filterhashtable-to-filter-event-log-with-powershell/

https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/

日志 任务 精确 处理 事件 用户 例子 名称 时间 结果 微软 尝试 查询 监控 实践 复杂 信息 函数 字段 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重庆互联网络科技 深圳科技互联网 深圳互联网络科技有限公司 奇酷互联网科技 嘟嘟瓜互联网科技 互联网科技革命 天扬科技互联网广告 阿里巴巴算科技企业还是互联网 花神(南京)互联网科技有限公司 开一家科技互联网公司需要多少钱 河南住房之家互联网科技 广州新华互联网科技学校电竞方面 四川慕妮娅互联网科技有限公司 明优互联网科技有限公司 工业互联网展湾科技股份有限公司 互联网科技股为什么大涨 扫呗互联网科技有限公司 互联网科技手抄报图片 互联网科技品牌 互联网的黑科技实验室 天速互联网络科技有限公司 互联网教育科技公司vipkid 中国的互联网科技企业的崛起 阿里互联网科技公司 宁夏众和广鑫互联网科技有限公司 厦门千工互联网科技有限公司 四川互联网展示科技馆设计 广西科技产业互联网是什么 互联网领先科技活动 互联网科技对化妆品行业
0