Ubuntu Filebeat自定义日志解析规则步骤
Ubuntu系统中,Filebeat的主配置文件默认位于/etc/filebeat/filebeat.yml。修改前建议备份原文件(如sudo cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak),避免配置错误导致服务异常。
在filebeat.yml中,通过filebeat.inputs section定义需要监控的日志文件。例如,监控系统日志(/var/log/syslog、/var/log/auth.log)和Nginx日志(/var/log/nginx/access.log、/var/log/nginx/error.log),并添加service字段标识日志来源(便于后续区分):
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/syslog
- /var/log/auth.log
fields:
service: system
fields_under_root: true # 将fields合并到根层级,避免嵌套
ignore_older: 72h # 忽略72小时前的旧日志(可选)
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
fields:
service: nginx
fields_under_root: true
此步骤确保Filebeat正确读取目标日志文件,并为后续解析添加上下文字段。
Filebeat支持多种日志解析处理器,最常用的是dissect(结构化日志)和grok(复杂正则日志),以下分别说明配置方法:
dissect处理器(推荐用于结构化日志)dissect通过预定义的模板从日志行中提取字段,适合格式固定的日志(如Nginx、系统日志)。配置示例如下:
processors:
- dissect:
tokenizer: '%{timestamp} %{log_level} %{message}' # 定义日志格式模板,%{}表示变量
field: 'message' # 指定要解析的原始字段(通常为message)
target_prefix: '' # 解析后的字段直接添加到根层级(无前缀)
若日志格式更复杂(如包含IP、用户ID),可扩展模板:
processors:
- dissect:
tokenizer: '%{timestamp} [%{email}] %{log_level} User logged in: user_id%{user_id}, session_id%{session_id}'
field: 'message'
target_prefix: ''
上述配置会将message字段解析为timestamp、email、log_level、user_id、session_id等字段。
grok处理器(推荐用于复杂/非结构化日志)grok通过正则表达式匹配日志内容,灵活性更高,但性能略低于dissect。需先定义grok模式(可通过Elastic Grok Debugger测试),再添加到配置中:
processors:
- grok:
patterns:
- 'IPV4: %{IP:client_ip}' # 提取IP地址
- 'METHOD: %{WORD:method}' # 提取HTTP方法(GET/POST等)
- 'REQUEST: %{URIPATHPARAM:request}' # 提取请求路径和参数
- 'STATUS: %{NUMBER:status:int}' # 提取状态码(转为整数)
match:
- '%{IPV4:client_ip} %{METHOD:method} %{REQUEST:request} %{STATUS:status}' # 匹配Nginx access.log格式
target: '' # 解析后的字段添加到根层级
此配置适用于Nginx的access.log(如192.168.1.1 GET /index.html 200)。
add_fields处理器为日志事件添加额外信息(如环境、项目名称):processors:
- add_fields:
fields:
env: production # 添加环境字段
project: myapp # 添加项目字段
drop_fields处理器移除冗余字段(如beat、source),减少存储占用:processors:
- drop_fields:
fields: ["beat", "source", "offset"] # 移除指定字段
convert处理器将字段转为正确类型(如将timestamp转为Elasticsearch可识别的日期格式):processors:
- convert:
field: "timestamp"
type: "date" # 转为日期类型
这些处理器可根据需求组合使用,优化日志数据结构。
确保Filebeat将解析后的日志发送到目标存储(如Elasticsearch或Logstash)。以下是发送到Elasticsearch的示例配置:
output.elasticsearch:
hosts: ["localhost:9200"] # Elasticsearch地址
index: "%{service}-%{+YYYY.MM.dd}" # 按service和日期创建索引(如system-2025.10.17)
若使用Logstash转发,可配置output.logstash:
output.logstash:
hosts: ["localhost:5044"] # Logstash地址
根据实际环境调整输出目标。
完成配置后,保存filebeat.yml文件,然后重启Filebeat服务使更改生效:
sudo systemctl restart filebeat
重启后,通过以下命令查看Filebeat日志,确认配置是否正确:
sudo journalctl -u filebeat -f
若出现错误(如dissect模板与日志格式不匹配),需调整处理器配置并重新重启。
dissect的tokenizer必须与日志格式严格一致(如空格、符号位置),否则会导致解析失败;grok的正则表达式需测试通过后再使用。grok,但大量日志场景下优先选择dissect(性能更高)。