可以实现自定义,但需区分两类“格式”
- 事件内容的结构化解析:让 Ubuntu 的系统日志(如 /var/log/syslog、/var/log/auth.log)按你指定的字段结构输出(时间戳、主机、进程、消息等)。
- 输出呈现格式:控制写入 Elasticsearch 的索引名、是否美化 JSON、或输出到 Logstash 时的事件形态。
方案一 使用内置 System 模块并自定义解析
- 启用模块与配置路径
- 启用模块:sudo filebeat modules enable system
- 配置目录:/etc/filebeat/modules.d/system.yml(可按需调整)
- 自定义解析思路
- 保留模块自带的 Ingest Pipeline(推荐):只调整 pipeline 的日期格式、字段映射或新增处理器,避免重写 grok,稳定性更好。
- 完全自定义 grok:在 Elasticsearch 中为 system 模块创建自定义 pipeline,用 dissect/grok 按你的日志样式解析,然后在 Filebeat 指定该 pipeline。
- 输出到 Logstash 时
- 在 filebeat.yml 中启用 Logstash 输出,由 Logstash 承担复杂解析与再加工(示例与常见 system 日志的 grok 模式可参考实践文章)。
方案二 不用模块,直接用 inputs + processors 自定义
- 适用场景:/var/log 下的自定义应用日志或非标准 syslog。
- 最小可用配置示例(filebeat.yml)
- filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/myapp.log
fields:
log_type: myapp
processors:
- dissect:
tokenizer: “%{ts} %{+ts} %{host} %{proc}[%{pid}]: %{msg}”
field: “message”
target_prefix: “”
- date:
field: “ts”
formats: [“ISO8601”, “Jan _2 15:04:05”, “2006-01-02 15:04:05”]
target_field: “@timestamp”
- add_fields:
fields:
env: “prod”
- output.elasticsearch:
hosts: [“localhost:9200”]
index: “myapp-%{+yyyy.MM.dd}”
- 要点
- 先用 dissect 做轻量切分,再用 date 统一时间,必要时用 grok 处理复杂模式。
- 通过 fields 添加业务标签,便于后续在 ES/Kibana 中筛选与聚合。
方案三 自定义输出格式与索引命名
- 输出到 Elasticsearch 的呈现
- 开启 JSON 美化:在 output.elasticsearch 中设置 pretty: true(便于调试)。
- 自定义索引名:例如 index: “filebeat-%{[agent.version]}-%{+yyyy.MM.dd}”。
- 输出到 Logstash
- 将事件以结构化 JSON 发送至 Logstash(默认行为),由 Logstash 决定最终索引与存储格式。
- 生效与验证
- 修改后重启:sudo systemctl restart filebeat
- 查看服务日志:sudo journalctl -u filebeat -f,确认无报错且事件已发送。
实践建议
- 优先使用 System 模块 + 自定义 Ingest Pipeline,减少对 Filebeat 侧逻辑的侵入,升级更平滑。
- 对时间字段统一到 @timestamp,避免多时区与格式混乱。
- 始终在输出侧设置明确的 index 命名策略,便于 ILM 与权限控制。
- 复杂多行堆栈(如 Java 异常)使用 multiline 配置,避免行被错误拆分。