rsyslog无法将日志转发至ElasticSearch问题排查求助
问题:rsyslog→Logstash→ElasticSearch日志链路无数据到ES
已完成配置
rsyslog 配置
- 输出规则文件
/etc/rsyslog.d/60-output.conf:
*.* @localhost:10514;json-template
- JSON 格式化模板文件
/etc/rsyslog.d/01-json-template.conf:
template(name="json-template" type="list") { constant(value="{") constant(value="\"@timestamp\":\"\"") property(name="timereported" dateFormat="rfc3339") constant(value="\",\"@version\":\"1") constant(value="\",\"message\":\"\"") property(name="msg" format="json") constant(value="\",\"sysloghost\":\"\"") property(name="hostname") constant(value="\",\"severity\":\"\"") property(name="syslogseverity-text") constant(value="\",\"facility\":\"\"") property(name="syslogfacility-text") constant(value="\",\"programname\":\"\"") property(name="programname") constant(value="\",\"procid\":\"\"") property(name="procid") constant(value="\"}\n") }
- 已重启 rsyslog 服务
Logstash 配置
配置文件 /etc/logstash/conf.d/logstash.conf:
input { udp { port => 10514 codec => "json" type => "rsyslog" } } filter { } output { if [type] == "rsyslog" { elasticsearch { hosts => [ "localhost:9200" ] } } }
- 已重启 Logstash 服务
当前排查结果
- 端口监听验证:执行
sudo netstat -tulpn | grep 10514,确认 Logstash 正常监听 10514 端口:
user@rsyslog-server:/var/log$ sudo netstat -tulpn | grep 10514 udp 0 0 0.0.0.0:10514 0.0.0.0:* 5327/java
- ES 数据验证:执行
curl -XGET 'http://localhost:9200/logstash-*/_search?q=*&pretty',无任何数据返回:
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 0, "successful" : 0, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : 0.0, "hits" : [ ] } }
- 使用版本:
- rsyslogd 8.2208.0 (2022.08)
- logstash 7.17.8
- elasticsearch 7.17.8
解决步骤
1. 修复 rsyslog JSON 模板语法错误
当前模板存在字符串拼接逻辑错误,导致生成的 JSON 格式完全无效,Logstash 无法解析。修正后的模板:
template(name="json-template" type="list") { constant(value="{") constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339") constant(value="\"") constant(value="\",\"@version\":\"1\"") constant(value="\",\"message\":\"") property(name="msg" format="json") constant(value="\"") constant(value="\",\"sysloghost\":\"") property(name="hostname") constant(value="\"") constant(value="\",\"severity\":\"") property(name="syslogseverity-text") constant(value="\"") constant(value="\",\"facility\":\"") property(name="syslogfacility-text") constant(value="\"") constant(value="\",\"programname\":\"") property(name="programname") constant(value="\"") constant(value="\",\"procid\":\"") property(name="procid") constant(value="\"") constant(value="}\n") }
说明:每个字段的开头引号放在 constant 中,属性值输出后补充结尾引号,确保生成标准的 JSON 结构。
2. 验证 rsyslog 输出的 JSON 格式
重启 rsyslog 后,手动生成测试日志:
logger "test rsyslog to logstash"
用 tcpdump 抓取 10514 端口的数据包,检查输出是否为合法 JSON:
sudo tcpdump -i lo udp port 10514 -A
3. 检查 Logstash 运行日志
查看 Logstash 错误日志,确认是否存在 JSON 解析报错:
sudo tail -f /var/log/logstash/logstash-plain.log
如果出现 JSON parse error,说明模板问题未完全解决,需再次调整模板内容。
4. 调整 Logstash 输入配置(可选)
如果仍存在解析问题,可将 UDP 输入的 codec 改为 json_lines,适配单行 JSON 格式:
input { udp { port => 10514 codec => "json_lines" type => "rsyslog" } }
修改后重启 Logstash 重新测试。
5. 验证 ES 索引生成
若 Logstash 正常处理数据,ES 会自动创建 logstash-YYYY.MM.DD 格式的索引。执行以下命令查看所有索引:
curl -XGET 'http://localhost:9200/_cat/indices?v'
确认目标索引存在后,再执行搜索命令验证数据是否写入。
内容的提问来源于stack exchange,提问作者Renaud is Not Bill Gates
相关产品推荐
相关产品推荐

