Filebeat日志格式自定义方法
一 概念澄清
- Filebeat自身运行日志:指 Filebeat 进程内部打印的日志(如启动、连接、报错等),可配置为文本或JSON格式,便于本地排查或接入集中式日志系统。
- 采集并输出的业务日志:指 Filebeat 从文件/标准输入读取的日志事件,可添加/删除字段、解析 JSON、控制索引名、打标签等,决定进入 Elasticsearch/Logstash/Kafka 的最终结构与内容。
二 自定义 Filebeat 自身运行日志格式
- 配置段为 logging,常用选项:
- level:日志级别,如 info/debug/warning/error。
- format:日志格式,支持 plain(默认)与 json。
- to_files / files:将日志写入文件;常用子项有 path、name、keepfiles、rotateeverybytes、permissions。
- 示例(输出 JSON 到文件,保留 7 个轮转文件,单个文件 10MB):
logging:
level: info
to_files: true
format: json
files:
path: /var/log/filebeat
name: filebeat.log
keepfiles: 7
rotateeverybytes: 10485760
permissions: 0640
- 应用与验证:
- 重启服务:Linux 执行
sudo systemctl restart filebeat;Windows 通过服务管理器重启。
- 查看日志:Linux 执行
tail -f /var/log/filebeat/filebeat.log;JSON 日志便于机器解析与检索。
三 自定义采集并输出的业务日志格式
- 添加自定义字段与标签
- 使用 fields 添加字段;设置 fields_under_root: true 将字段提升为顶层字段(可能与内置字段重名并覆盖)。
- 使用 tags 为事件添加标签,便于分组与过滤。
- 解析 JSON 日志
- 单行 JSON:在输入上启用 json 解析,常用 keys_under_root: true 将解析出的键提升到事件根;json.add_error_key: true 在解析失败时添加 error.message 便于定位;json.message_key 指定将某字段作为 message 再进行解析。
- 多行日志合并
- 使用 multiline 将堆栈等跨行日志合并为单事件,常用组合:
pattern 匹配首行、negate: true、match: after,并设定 max_lines 与 timeout。
- 清理与整形
- 使用 processors 的 drop_fields 删除无用元数据(如 beat、input_type、offset、type 等),减少冗余与存储。
- 输出到 Elasticsearch 的索引命名
- 通过 output.elasticsearch.index 自定义索引名,支持日期模板(如 filebeat-%{+yyyy.MM.dd}),便于按日分片与生命周期管理。
- 示例(综合配置片段)
filebeat.inputs:
- type: log
paths:
- /var/log/myapp/*.log
fields:
app: myapp
env: prod
fields_under_root: true
tags: ["web", "nginx"]
json.keys_under_root: true
json.add_error_key: true
json.message_key: log
multiline:
pattern: '^\['
negate: true
match: after
max_lines: 500
timeout: 5s
processors:
- drop_fields:
fields: ["beat", "input_type", "offset", "type"]
output.elasticsearch:
hosts: ["http://es.example.com:9200"]
index: "myapp-logs-%{+yyyy.MM.dd}"
- 应用与验证:
- 重启 Filebeat 后,向目标日志写入样例,在 ES/Kibana 或通过控制台查看事件结构与字段是否符合预期。
四 常见问题与排查
- 多行堆栈仍被拆散:检查 pattern/negate/match 是否与日志首行特征匹配,适当增大 max_lines 与 timeout。
- JSON 解析失败:开启 json.add_error_key: true,在事件里查看 error.message 定位非法片段;确认 json.message_key 指向包含 JSON 的字段。
- 自定义字段未出现在根层级:确认 fields_under_root: true 已设置,且不与内置字段冲突。
- 索引未按预期命名:核对 output.elasticsearch.index 的日期模板语法(如 %{+yyyy.MM.dd})与写入时间时区。
- 运行日志看不到新格式:确认 logging.format: json 已设置,且日志轮转参数(如 rotateeverybytes/keepfiles)合理;重启后查看 /var/log/filebeat/filebeat.log。