我有来自 Log4J2 的多行日志。
图案配置如下:
%d [%20.20t] [%10.10X{nthread}] [%20.20X{tid}] [%20.20X{app}] (%30.30c{3}) %-5p %X{stack} %X{rid} %X{uid} - %m%n
我创建了一个正则表达式来解析它,这似乎工作得很好。在我按照需要的方式配置数据后,这将解析数据。我不太担心一旦我拥有了这部分将如何实际工作(似乎一旦我拉入数据,Filter就会处理我需要的东西)。
(?<timestamp>[\d-]+ [\d:,]+) \[\s*(?<thread>[^\]]+)?\] \[\s*(?<nthread>[^\]]+)?\] \[\s*(?<tid>[^\]]+)?\] \[\s*(?<app>[^\]]+)?\] \(\s*(?<logger>[^\]]+)?\) (?<level>\S+) (?<stack>[^-]+) - (?<message>.*)
然后我尝试为 Fluent Bit 1.9.8 创建一个多行解析器。
[MULTILINE_PARSER]
Name custom_app_default
Type regex
#
# rules | state name | regex pattern | next state
# --------|----------------| ------------------------|-----------
rule "start_state" "/([\d-]+ [\d:,]+)/" "cont"
rule "cont" {CONUFSED_PART_HERE} "cont"
对于
{CONFUSED_PART_HERE}
我尝试了一些不同的事情。具体来说,我想说“任何不以 start_state
中列出的日期格式开头的内容,在正则表达式中使用前瞻。为此,我尝试使用以下方法来完成此操作:
/^(?![\d-]+ [\d:,]+)/
我的输入配置是这样使用的:
[INPUT]
Name tail
Path /opt/log-mount/**/CustomApp_CORE.log
Path_Key filename
Multiline.Parser custom_app_default
Mem_Buf_Limit 5MB
Skip_Long_Lines Off
Refresh_Interval 10
[INPUT]
Name tail
Path /opt/log-mount/**/CustomApp_ALERTS.log
Path_Key filename
Multiline.Parser custom_app_default
Mem_Buf_Limit 5MB
Skip_Long_Lines Off
Refresh_Interval 10
如何告诉多行解析器包含符合该日期格式的所有内容?
设置过滤器可以解决多行问题:
[INPUT]
Name tail
Path /opt/log-mount/**/CustomApp_CORE.log
Path_Key filename
Mem_Buf_Limit 5MB
Skip_Long_Lines Off
Refresh_Interval 10
[INPUT]
Name tail
Path /opt/log-mount/**/CustomApp_ALERTS.log
Path_Key filename
Mem_Buf_Limit 5MB
Skip_Long_Lines Off
Refresh_Interval 10
[FILTER]
Name multiline
Match *
Multline.Key_Content log
Multiline.Parser custom_app_default
现在我只需要弄清楚如何使用我的其他正则表达式解析消息中的数据,这应该很容易。