You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python读取Applications and Services日志结果数量不符参数咨询

问题原因

  • 代码缩进错误:你贴出的代码中win32evtlog.ReadEventLog调用行没有在while循环的缩进块内,实际运行时如果未修正会出现语法错误。
  • 传统接口读取逻辑问题:win32evtlog的OpenEventLog是Windows旧版经典事件日志接口,读取「应用程序和服务日志」这类基于ETW的新型事件通道时,默认会同时读取当前活跃日志+系统自动归档的历史日志,而事件查看器默认仅展示当前活跃日志的内容,所以会出现统计数量不一致的情况。
  • 无读取终止逻辑:当前代码没有设置读取停止条件,会遍历所有可读取的历史日志,直到全部读完才会停止。

修复方案

方案1:基于现有接口添加过滤逻辑

你可以添加时间范围过滤,和事件查看器的默认展示范围对齐,同时修正事件ID的读取逻辑:

import win32evtlog
from datetime import datetime, timedelta

server = 'localhost'
logtype = "Microsoft-Windows-Storage-Storport/Operational"
hand = win32evtlog.OpenEventLog(server, logtype)
flags = win32evtlog.EVENTLOG_FORWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ
# 可自定义时间范围,比如只读取最近7天的日志
time_threshold = datetime.now() - timedelta(days=7)

while True:
    events = win32evtlog.ReadEventLog(hand, flags, 0)
    if not events:
        break
    for event in events:
        event_time = datetime.fromtimestamp(event.TimeGenerated.timestamp())
        if event_time < time_threshold:
            # 顺序读取时超出时间范围后,后续事件时间更早,直接终止循环即可
            break
        print('Source Name:', event.SourceName)
        # 与0xFFFF按位与,过滤高位标志位,得到真实事件ID
        print('Event ID:', event.EventID & 0xFFFF)
        print('Time Generated:', event.TimeGenerated)

方案2:使用现代事件日志解析接口

如果需要完全匹配事件查看器的统计结果,建议使用evtx第三方库直接解析当前活跃的日志文件,日志默认路径为C:\Windows\System32\winevt\Logs\Microsoft-Windows-Storage-Storport%4Operational.evtx,可以精准读取当前日志内的所有记录,不会包含归档的历史数据。

内容的提问来源于stack exchange,提问作者user1204868

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 20:06:00