如何解析并访问特定JSON格式事件日志中的winlog与event数据?
问题分析与解决方法
错误原因
你的JSON日志最外层是数组(列表),直接用logs['event']或logs[i]["event"]会报错——列表只能用整数索引,不能用字符串;而且event和winlog都嵌套在每个日志项的_source字段里,不是直接在列表元素下。
正确访问方式
遍历日志列表时,每个循环变量是单个日志对象,需要先进入_source字段,再访问event和winlog。
示例代码
import json with open('logs.json', 'r') as json_file: logs = json.load(json_file) # 遍历每个日志项 for log_item in logs: # 获取_source里的核心数据 source_data = log_item['_source'] event_data = source_data['event'] winlog_data = source_data['winlog'] # 提取并格式化打印需要的字段 print("=== 日志详情 ===") print(f"事件动作: {event_data['action']}") print(f"事件代码: {event_data['code']}") print(f"事件创建时间: {event_data['created']}") print(f"Winlog任务: {winlog_data['task']}") print(f"目标用户名: {winlog_data['event_data']['TargetUserName']}") print(f"目标域名: {winlog_data['event_data']['TargetDomainName']}") print(f"登录类型: {winlog_data['event_data']['LogonTypeName']}") print(f"IP地址: {winlog_data['event_data']['IpAddress']}") print("----------------\n")
代码说明
logs是加载后的列表,每个log_item是列表中的单个日志对象。- 先取出
log_item['_source'],这才是包含所有业务数据的字典。 - 从
source_data中分别提取event和winlog字段,再进一步获取嵌套的子字段,比如winlog['event_data']['TargetUserName']。
简化打印(如果需要更简洁的输出)
如果只需要输出关键信息的单行格式,可以调整打印逻辑:
for log_item in logs: s = log_item['_source'] print(f"[{s['@timestamp']}] {s['event']['action']} | 用户: {s['winlog']['event_data']['TargetUserName']} | IP: {s['winlog']['event_data']['IpAddress']}")
内容的提问来源于stack exchange,提问作者grayhydra
相关产品推荐
相关产品推荐

