使用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
相关产品推荐
相关产品推荐

