使用 python 将日志 .txt 文件转换为 JSON

Converting a log.txt file to JSON using python

提问人:tthhhww 提问时间:11/15/2023 最后编辑:toyota Supratthhhww 更新时间:11/15/2023 访问量:45

问:

我正在学习 Python,编程知识非常有限,作为一个学习项目,我有一个 .txt 系统日志,我正在尝试将其转换为 JSON。

我希望 python 程序解析 .txt 文件,使每个事件成为一个对象,并将该事件的条目拆分为键值对。这样以后我就可以在日志中查询和汇总警报。最终我希望程序接受用户输入来查询 JSON(但那是另一天)。

我目前的脚本是这样的

import re
import json
import os

def parse_log_file(input_file):
    events = []

    with open(input_file, 'r') as file:
        log_content = file.read()

    # extract individual events
    event_pattern = re.compile(r'Event \d+\s+(.*?)\s+(?=(?:Event \d+|$))', re.DOTALL)
    matches = event_pattern.findall(log_content)

    for match in matches:
        event_dict = {}
        lines = match.split('\n')

        for line in lines:
            if line.strip():
                key, value = map(str.strip, line.split(':', 1))
                event_dict[key] = value

        events.append(event_dict)

    # Write the JSON output with the same name as the input file
    output_file = os.path.splitext(input_file)[0] + ".json"
    with open(output_file, 'w') as json_file:
        json.dump(events, json_file, indent=4)

    print(f"JSON file saved as,{output_file}")
if __name__ == "__main__":
    input_file = "log.txt"
    parse_log_file(input_file)

期望输出:

事件 1
{ “LogName” : “System”, “MachineName” : “LAPTOP” , “ProviderName” : “Intel”, “LevelDisplayName” : “Information”,



“Message: : ”检查剩余资源预算。模块 超出资源预算,无法分配FwCps,STATUS
= 系统资源不足,无法完成 API。

事件 2 {
“LogName” : “System”,
“MachineName” : “LAPTOP” “ProviderName” : “Microsoft-Windows-Kernel-Power” “LevelDisplayName” : “Information” “Message”


: “系统会话已从 186 转换为 188. 原因 InputPoUserPresent
BootId:67”

}

但是,我的输出目前如下所示:

日志名称 : “系统计算机名称 : 笔记本电脑
提供程序名称 : Microsoft-Windows-内核-电源
级别显示名称 : 信息
消息 : 系统
会话已从 186 转换为 188. 原因 InputPoUserPresent
BootId:67”

我哪里出错了?理想情况下,我想要警报的每个元素,即 LogName、MachineName 等。作为键,信息是值

数组 json python-3.x 事件日志

评论

1赞 Oxin 11/15/2023
你能添加一个 .txt 文件的样子吗?

答:

0赞 jwP54 11/15/2023 #1

在不同阶段使用 print 语句对此进行故障排除。首先,尝试打印来自

matches = event_pattern.findall(log_content)

如果这是你想要的,请继续前进。 打印“线条”并确保它是您想要的。

    for match in matches:
        event_dict = {}
        lines = match.split('\n')

使用这种方法,你就会明白的。