在python中解析自定义日志文件

在python中解析自定义日志文件,python,logparser,Python,Logparser,我有一个带有新行字符的日志文件 示例文件: 2019-02-12T00:01:03.428+01:00 [Error] ErrorCode {My error: "A"} - - - 00000000-0000-0000-6936-008007000000 2019-02-12T00:01:03.428+01:00 [Error] ErrorCode {My error: "A"} - - - 00000000-0000-0000-6936-008007000000 2019-02-

我有一个带有新行字符的日志文件

示例文件:

2019-02-12T00:01:03.428+01:00 [Error] ErrorCode {My error: "A"} -  -  - 00000000-0000-0000-6936-008007000000 
2019-02-12T00:01:03.428+01:00 [Error] ErrorCode {My error: "A"} -  -  - 00000000-0000-0000-6936-008007000000 
2019-02-12T00:03:23.944+01:00 [Information] A validation warning occurred: [[]] while running a file,
--- End of stack trace ---
    FileNotFoundError
--- End of stack trace from previous location where exception was thrown ---
    System Error
我想将数据分成三列,即Timestamp、type_code以显示事件是错误、警告还是信息,然后是消息

我已经为此使用了拆分功能:

currentDict = {"date":line.split("] ")[0].split(" [")[0],
                   "type":line.split("] ")[0].split(" [")[1],"text":line.split(" ]")[0].split("] ")[1]}
要在给定列中拆分数据,它可以正常工作,但如果有如下所示的条目,则会出现错误

2019-02-12T00:03:23.944+01:00 [Information] A validation warning occurred: [[]] while running a file,
--- End of stack trace ---
    FileNotFoundError
--- End of stack trace from previous location where exception was thrown ---
    System Error
第二种方法是使用正则表达式

with open(name, "r") as f:
         for lines in f:
             data_matcher = re.findall("^\\d{4}[-]?\\d{1,2}[-]?\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{1,3}[+]?\\d{1,2}:\\d{1,2}",
                              lines)


使用此选项,我只能提取时间戳,但无法确定如何提取“下一个到”字段。

您不需要对正则表达式如此精确:

重新导入
log\u pattern=re.compile(r“([0-9\-]*)T([0-9\-:.+]*)\s*\[([^]*)\]](.*))
以open(名称“r”)作为f:
对于f中的行:
匹配=对数模式。匹配(线)
如果不匹配:
持续
grps=match.groups()
打印(“日志行:”)
打印(f“日期:{grps[0]},\n时间:{grps[1]},\n类型:{grps[2]},\n文本:{grps[3]}”)

你甚至可以想象没有那么精确,例如
r”(.*)T([^\s]*)\s*\[([^]]*)\](.*)”
也可以工作。这里有一个很好的工具可以用来测试正则表达式:。

解析时的一个好建议是停止尝试一次性操作(尽管这很有趣)。例如,编写一个大型正则表达式来解析所有内容:

re.findall("...", TEXT)
或者从单个(有时链接)代码行中的文本中提取值:

LINE.split("...")[...].split("...")[...]
相反,将逻辑分解为一系列简单步骤(通常分配给中间变量),其中每个步骤为另一个简单步骤铺平道路。在您的情况下,这些步骤可能是:

time, rest = line.split(' [', 1)
line_type, msg = rest.split('] ', 1)

在凌乱数据的现实世界中,有时需要在小步骤之间添加错误处理或健全性检查逻辑。

好吧,如何说得最好:使用空格作为字段分隔符和字段内部,而不同时被引用,这将是解析此字段时的一个严重问题。您可以尝试有限的左分割和右分割,然后从两侧靠近文本字段。