如何配置Spring Boot Tomcat日志模式拆分Kibana日志message字段
解决方案
要实现Kibana中字段自动拆分检索,核心是让日志采集组件(Filebeat/Logstash)可直接识别字段,无需复杂正则拆分原始文本,推荐两种可行落地方案:
方案1:直接输出JSON格式Tomcat访问日志(推荐)
直接将访问日志配置为标准JSON格式,采集时会自动映射为Elasticsearch独立字段,无需额外解析规则,配置示例如下:
tomcat: basedir: /xx/xxxx accesslog: enabled: true # 按实际业务需求配置开关 pattern: '{"verb":"%m","request":"%U%q","responseCode":"%s","remoteHost":"%h","user":"%u","requestTime":"%{yyyy-MM-dd''T''HH:mm:ss,SSSXXX}t","bytesSent":"%b","processTime":"%D","transactionId":"%{Transaction-ID}o"}' directory: /xxx/logs/aaa-aaaa/xx-logs/ file-date-format: .yyyy-MM-dd encoding: UTF-8
占位符含义对应你需要的字段:
%m:匹配HTTP动词(GET/POST等),对应verb字段%U匹配请求路径、%q匹配查询参数,拼接后就是完整请求地址,对应request字段%s匹配HTTP响应状态码,对应responseCode字段- 其他自定义字段可按照JSON键值对格式直接新增即可
配置完成后每行日志为标准JSON结构,示例如下:
{"verb":"GET","request":"/v1/compare?details.id=30101","responseCode":"200","remoteHost":"127.0.0.1","transactionId":"xxxxxxx-jhjhj-xxcc-0000-d8f5c5570000"}
采集时开启JSON解析功能,Kibana中就可以直接检索所有独立字段。
方案2:保留文本格式,通过采集层正则拆分
如果不想修改现有日志输出格式,可以在Filebeat/Logstash中配置Grok正则拆分现有日志,你当前使用的日志模式对应的Grok规则示例如下:
%{IP:remote_host} %{DATA:remote_logname} %{DATA:remote_user} %{TIMESTAMP_ISO8601:request_time} "%{WORD:verb} %{URIPATH:request_path}%{URIPARAM:query_params} HTTP/%{NUMBER:http_version}" %{NUMBER:response_code:int} %{NUMBER:bytes_sent:int} %{NUMBER:process_time:int} %{DATA:transaction_id}
拆分后也可生成对应独立字段,但是该方案需要同步维护正则规则,日志格式变动时需要同步调整,容错率低于直接输出JSON的方案。
如果需要拆分响应体中的字段,可在采集层额外配置body的JSON解析规则,也可以直接在业务代码中将需要检索的核心字段打印到访问日志自定义位,避免解析全量响应体。
内容的提问来源于stack exchange,提问作者PGuru
相关产品推荐
相关产品推荐

