LogStash 8.2.0如何编写GROK Pattern提取日志线程名称
GROK提取Logback日志线程字段实现方案
现有规则问题
你当前编写的规则中\[%{LOGLEVEL:loglevel}.*]段使用了贪婪匹配符.*,会直接吞掉日志级别字段后方的所有内容直到本行最后一个]字符,导致后续的线程名字段没有匹配空间,这是无法提取线程名的核心原因。
另外你的Logback配置中日志级别使用了%-5level占位符,输出时会自动在短级别(比如WARN、INFO)后补空格凑够5位字符宽度,匹配时需要专门处理这部分冗余空格。
可用匹配规则
直接替换为以下完整GROK规则即可提取包括线程名在内的全量字段:
%{DATE_EU:date} %{TIME:time} %{ISO8601_TIMEZONE:zone} \[%{LOGLEVEL:loglevel}\s*\] \[%{DATA:thread}\] %{JAVACLASS:logger} - %{GREEDYDATA:log_message}
规则说明
\[%{LOGLEVEL:loglevel}\s*\]:匹配方括号包裹的日志级别,\s*用来吃掉级别后自动补的空格,遇到右方括号立刻停止匹配,不会越界\[%{DATA:thread}\]:匹配紧随其后的方括号包裹内容,提取为thread字段,对你给出的示例日志会提取到值main- 后续的
%{JAVACLASS:logger}和%{GREEDYDATA:log_message}是可选匹配项,分别提取日志打印类名和日志正文,不需要可以直接删除,不影响前面字段的提取结果
验证结果
对你提供的示例日志行,该规则提取结果如下:
- date:
07/06/2022 - time:
14:37:41.471 - zone:
+0530 - loglevel:
WARN - thread:
main - logger:
com.cmt.trial.logging.LoggingTrial - log_message:
Trying to log an warn
内容的提问来源于stack exchange,提问作者hell_storm2004
相关产品推荐
相关产品推荐

