如何用Python将DHCP日志文本正确转换为指定格式的JSON?
DHCP日志转JSON字段错位问题修复
问题场景
原始DHCP日志格式
Nov 28 06:26:45 server-01 dhcpd: DHCPDISCOVER from cc:d3:e2:7a:af:40 via 10.39.192.1 Nov 28 06:26:45 server-01 dhcpd: DHCPOFFER on 10.39.255.253 to cc:d3:e2:7a:af:40 via 10.39.192.1
当前脚本错误输出
{ "emp1": { "timestamp": "Nov", "Server": "28", "Service": "06:26:45", "Message": "server-01" }, "emp2": { "timestamp": "Nov", "Server": "28", "Service": "06:26:45", "Message": "server-01" } }
预期正确输出
{ "timestamp":"Nov 28 06:26:45", "Server":"server-01", "Service":"dhcpd", "Message":"DHCPOFFER on 10.39.255.253 to cc:d3:e2:7a:af:40 via 10.39.192.1" }
问题原因
你的脚本应该是直接按空格拆分日志行,但日志结构是[时间戳] [服务器名] [服务名]: [消息内容],时间戳和消息内容都包含空格,简单拆分会导致字段对应关系完全错位。
修复方案
使用正则表达式精准匹配日志的各个字段,确保每个部分被正确提取。以下是完整的Python脚本:
import re import json # 读取日志内容(实际场景可替换为读取文件) log_content = """Nov 28 06:26:45 server-01 dhcpd: DHCPDISCOVER from cc:d3:e2:7a:af:40 via 10.39.192.1 Nov 28 06:26:45 server-01 dhcpd: DHCPOFFER on 10.39.255.253 to cc:d3:e2:7a:af:40 via 10.39.192.1""" parsed_entries = [] # 正则匹配规则:时间戳(含空格)、服务器名(无空格)、服务名(无空格直到冒号)、消息内容(剩余所有) log_pattern = re.compile(r'^(\w{3} \d{2} \d{2}:\d{2}:\d{2}) (\S+) (\S+): (.*)$') for line in log_content.strip().split('\n'): line = line.strip() if not line: continue match = log_pattern.match(line) if match: parsed_entry = { "timestamp": match.group(1), "Server": match.group(2), "Service": match.group(3), "Message": match.group(4) } parsed_entries.append(parsed_entry) # 输出单条日志的JSON(对应预期格式) if parsed_entries: print(json.dumps(parsed_entries[0], indent=2)) # 如果需要输出所有日志的数组格式,取消下面注释 # print(json.dumps(parsed_entries, indent=2))
代码说明
- 正则表达式:
^(\w{3} \d{2} \d{2}:\d{2}:\d{2})匹配完整时间戳(如Nov 28 06:26:45);(\S+)匹配无空格的服务器名和服务名;(.*)捕获冒号后的全部消息内容。 - 日志处理:逐行读取日志,跳过空行,匹配成功后将字段映射到JSON对象中。
- 输出控制:可以选择输出单条日志(对应你的预期格式),或者所有日志组成的JSON数组。
运行后输出(单条示例)
{ "timestamp": "Nov 28 06:26:45", "Server": "server-01", "Service": "dhcpd", "Message": "DHCPDISCOVER from cc:d3:e2:7a:af:40 via 10.39.192.1" }
内容的提问来源于stack exchange,提问作者Abhiyantraka
相关产品推荐
相关产品推荐

