我刚开始玩logstash,我在获取日志发送程序进程以将事件发送到另一台主机上的 redis 服务器时遇到问题。
output
我的 logstash 配置文件的节读取
输出 { redis { host => "11.22.33.44" data_type => "list" key => "logstash" } }
但是,当我运行 logstash 进程时,我收到包含以下内容的错误消息
:exception=>#<SocketError: 网络不可达>
一点strace
ing 表明它在这里失败了:
connect(13, {sa_family=AF_INET6, sin6_port=htons(6379), inet_pton(AF_INET6, "::ffff:11.22.33.44", &sin6_addr) = -1 ENETUNREACH(网络不可达)
即它试图连接到 ipv6 映射的 ipv4 地址上的 redis 主机。主机没有本机 ipv6 地址,连接失败。
我怎样才能让进程AF_INET
代替使用AF_INET6
,或者以某种方式配置我的主机来解决这个问题?
如果相关,我的 java 版本是
Java 版本“1.6.0_18” OpenJDK 运行时环境 (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze2) OpenJDK 64 位服务器 VM(构建 14.0-b16,混合模式)
这是由这个错误引起的:该
sysctl
设置net.ipv6.bindv6only=1
破坏了 Debian squeeze(可能还有其他平台)中的 Java 网络。该设置似乎只对想要区分 ipv6 和 ipv4 连接的人有意义。我真的不在乎这个,所以我做到了
启动了 logstash 代理,它成功了!
logstash的创建者事后好心地告诉我,你也可以添加
-Djava.net.preferIPv4Stack=true
到命令行。