Filebeat转Redis再到Logstash/ES配置及Redis报错解决
咱们一步步拆解你的问题——你现在面临两个核心问题:Filebeat往Redis推日志时的RPUSH参数错误,以及Logstash连接Redis失败,同时还需要正确的Filebeat Redis输出和Logstash Redis输入配置。我来逐一帮你解决:
一、先搞定核心报错:ERR wrong number of arguments for 'rpush' command
这个错误的本质是Filebeat发给Redis的RPUSH命令参数不符合Redis的要求(RPUSH必须至少传「列表名+要推送的内容」两个参数)。常见原因和修复方案如下:
检查Filebeat的输出格式配置
如果你在Filebeat里设置了format: string但没指定输出模板,很可能导致Filebeat推送空值给Redis,触发参数错误。推荐用默认的json格式,或者显式配置模板:output.redis: hosts: ["你的Redis地址:6379"] key: "filebeat-logs" format: json # 默认值,也可以显式写出来 # 如果非要用string格式,必须指定template,比如: # format: string # template: "%{[@timestamp]} %{[message]}"Redis版本或批量推送兼容性问题
旧版本的Filebeat(比如7.x之前)在开启批量推送(bulk_max_size>1)时,会用RPUSH key 值1 值2 ...的批量格式,但如果你的Redis版本低于2.4,就不支持这种批量写法。解决办法二选一:- 把Redis升级到2.4及以上;
- 在Filebeat里禁用批量推送:
output.redis: bulk_max_size: 1
Redis认证配置缺失
如果Redis设置了密码,但Filebeat没配置password,可能导致连接后命令执行异常,有时候也会表现为参数错误。记得加上密码配置:output.redis: password: "你的Redis密码"
二、Filebeat.yml Redis输出的完整配置示例
给你一个经过验证的配置片段,直接替换对应参数就能用:
filebeat.inputs: - type: log enabled: true paths: - /var/log/*.log # 换成你的实际日志路径 output.redis: enabled: true hosts: ["127.0.0.1:6379"] # Redis服务器地址+端口 key: "filebeat-log-queue" # Redis列表名称,Logstash要从这个列表读 password: "" # 无密码就留空,有密码就填 db: 0 # Redis数据库编号,默认0即可 format: json # 推荐用json,方便Logstash解析 bulk_max_size: 2048 # 批量推送的最大事件数,根据Redis性能调整 timeout: 5s # 连接超时时间
三、Logstash Redis输入的正确配置示例
Logstash需要从Redis的指定列表读取事件,这里给你一个完整的配置文件示例(比如命名为redis-input.conf):
input { redis { host => "127.0.0.1" # Redis服务器地址 port => 6379 password => "" # 和Redis的密码对应 db => 0 key => "filebeat-log-queue" # 必须和Filebeat里的key完全一致 data_type => "list" # 对应Filebeat的RPUSH,类型是列表 codec => "json" # 和Filebeat的format对应,用json解析事件 threads => 2 # 读取线程数,根据负载调整 batch_count => 128 # 每次批量读取的事件数 } } filter { # 这里可以加你的日志过滤规则,比如解析Apache/Nginx日志 grok { match => { "message" => "%{COMBINEDAPACHELOG}" } # 示例:解析Apache日志 } } output { elasticsearch { hosts => ["http://127.0.0.1:9200"] index => "filebeat-%{+YYYY.MM.dd}" # 按日期生成ES索引 } stdout { codec => rubydebug } # 调试用,把事件输出到控制台 }
启动Logstash时用这个配置:bin/logstash -f redis-input.conf
四、Logstash连接Redis失败的解决方案
如果Logstash启动时提示连接Redis失败,按以下步骤排查:
先检查网络连通性
在Logstash服务器上执行redis-cli -h 你的Redis地址 ping,如果返回PONG说明网络通;如果不通:- 检查Redis服务器的防火墙是否开放6379端口;
- 检查Redis配置文件里的
bind参数,别只绑定127.0.0.1(这样只能本地访问),改成bind 0.0.0.0或者添加Logstash服务器的IP; - 检查Redis的
protected-mode,测试环境可以临时关闭,生产环境建议关闭并设置密码。
认证与权限检查
- 确认Logstash配置的
password和Redis的requirepass完全一致; - 如果用了Redis ACL,确保Logstash的用户有
RPOP或BLPOP(根据data_type)的权限。
- 确认Logstash配置的
Redis服务状态检查
在Redis服务器上执行redis-cli info,确认Redis服务正常运行,没有内存不足、连接数超限等问题。更新Logstash Redis插件
旧版本的Logstash Redis插件可能和新版本Redis不兼容,尝试更新插件:bin/logstash-plugin update logstash-input-redis
内容的提问来源于stack exchange,提问作者Sonal




