如何在Fluentd中解析Kubernetes日志生成自定义字段?
一、优先用Fluentd实现字段拆分(最优解)
Fluentd作为日志采集层提前解析字段,能减少Elasticsearch的计算压力,是首选方案。基于v1.14.6版本,核心用parser插件,分两种常见日志格式处理:
1. 结构化JSON日志
如果你的应用输出JSON格式日志(示例:{"date":"2024-05-20","time":"14:30:00","logType":"INFO","endpoint":"/api/user","traceid":"abc123","spanid":"def456","username":"admin","other":"request success"}),直接添加这段filter配置:
<filter kubernetes.**> @type parser key_name log # 指定要解析的字段,默认是log <parse> @type json </parse> reserve_data true # 可选,保留原始日志字段 </filter>
2. 非结构化自定义格式日志
如果日志是纯文本自定义格式(示例:2024-05-20 14:30:00 INFO /api/user abc123 def456 admin request success),用正则解析,添加这段filter:
<filter kubernetes.**> @type parser key_name log <parse> @type regexp # 正则需完全匹配你的日志格式,此处为示例,请根据实际日志调整 expression /^(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}:\d{2}:\d{2}) (?<logType>\w+) (?<endpoint>\/\S+) (?<traceid>\w+) (?<spanid>\w+) (?<username>\w+) (?<other>.*)$/ </parse> reserve_data true </filter>
额外调整(可选)
解析后若需删除无用原始字段,添加record_transformer插件:
<filter kubernetes.**> @type record_transformer remove_keys log, kubernetes, docker # 删掉不需要的字段 </filter>
二、Elasticsearch侧方案(Fluentd搞不定时)
如果日志格式过于复杂,Fluentd解析困难,用ES的ingest pipeline做字段提取:
- 创建解析管道:
PUT _ingest/pipeline/log-parse-pipeline { "description": "拆分自定义日志字段", "processors": [ { "grok": { "field": "log", "patterns": ["%{DATE:date} %{TIME:time} %{WORD:logType} %{URIPATH:endpoint} %{WORD:traceid} %{WORD:spanid} %{WORD:username} %{GREEDYDATA:other}"] } }, { "remove": { "field": "log" } } ] }
- 给目标索引设置默认管道:
PUT /your-log-index/_settings { "index.default_pipeline": "log-parse-pipeline" }
三、Kibana临时方案(仅展示用)
如果只是需要在Kibana查看拆分后的字段,无需存储到ES,用脚本字段临时处理:
- 进入Kibana「管理」→「索引模式」→ 选择目标索引
- 点击「脚本字段」→「添加脚本字段」
- 比如添加
date字段:- 名称:
date - 类型:字符串
- 脚本:
String log = doc['log'].value; return log.split(' ')[0];
- 名称:
- 其他字段同理,根据日志格式调整拆分逻辑
注意:脚本字段是实时计算的,会拖慢Kibana查询速度,仅适合临时场景使用。
内容的提问来源于stack exchange,提问作者kernel
相关产品推荐
相关产品推荐

