You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 服务

当前排查结果

  1. 端口监听验证:执行 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 
  1. 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" : [ ]
  }
}
  1. 使用版本:
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:20:36