使用pyspark和regexp解析多行日志

2024-05-13 01:50:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难用pyspark将日志文件拆分为可能包含多行事件的数据帧。这些事件正是我需要帮助的

日志文件的格式为

2020-04-03T14:12:24,368 DEBUG [main] blabla bla bla bla
2020-04-03T14:12:24,371 DEBUG [main] bla bla bla bla 
2020-04-03T14:12:24,348 DEBUG [Thread-2] multiline log line bla bla 
bla bla bla
bla bla
    blablabla
2020-04-03T14:12:24,377 DEBUG [main] blabla bla bla bla

要将一行拆分为多个组,我只需使用

log_pattern = r'(\d*-\d*-\d*)T(\d*:\d*:\d*,\d*)[ ]{1,}(DEBUG|INFO|WARN|FATAL|ERROR|TRACE)[ ]{1,}(\[.*\])[ ]{1,}(.*)'
logs_df = base_df.select(regexp_extract('value', log_pattern, 1).alias('date'),
                         regexp_extract('value', log_pattern, 2).alias('timestamp'),
                         regexp_extract('value', log_pattern, 3).alias('log_level'),
                         regexp_extract('value', log_pattern, 4).alias('application'),
                         regexp_extract('value', log_pattern, 5).alias('log_content'))
logs_df.show(10, truncate=True)

输出:

+----------+------------+---------+-----------+--------------------+
|      date|   timestamp|log_level|application|         log_content|
+----------+------------+---------+-----------+--------------------+
|2020-04-08|00:35:12,014|     INFO|     [main]|Log4J2Helper:68 -...|
|2020-04-08|00:35:12,014|     INFO|     [main]|Log4J2Helper:69 -...|
....

我想要的是log_content包含多行日志事件。然而,我不明白我应该如何根据多行注释分割行。我已经尝试过拆分,regexp lookahead,但似乎没有得到正确的结果

spark.read.tex似乎具有自定义新行分隔符的选项,但它不能接受regexp

我想先使用re模块进行解析,但由于日志文件的大小只有千兆字节,我可能会遇到内存和处理问题

有人能告诉我应该如何处理这些大型多行日志文件吗


Tags: 文件debuginfologdfvaluemain事件
1条回答
网友
1楼 · 发布于 2024-05-13 01:50:32

您可以在最后一个组(.*(?:\r?\n(?!\d+-).*)*)中使用负前瞻来捕获以下所有不以1个或多个数字和连字符开头的行

请注意,如果使用\d*-\d*-\d*,还可以匹配,因为量词*匹配0次或更多次

这部分\[.*\]可以使用否定字符类\[[^][]*\]来编写,以防止过度匹配并使其性能更高

(\d+-\d+-\d+)T(\d+:\d+:\d+,\d+)[ ]+(DEBUG|INFO|WARN|FATAL|ERROR|TRACE)[ ]+(\[[^][]*\])[ ]+(.*(?:\r?\n(?!\d+-).*)*)

Regex demo

相关问题 更多 >