这是此问题的后续问题上一个问题,之所以创建是因为我发现了更多信息,并且将其作为新问题提出更加清晰。
我正在使用 syslog-ng OSE v3.31.2 通过 UDP 端口 514 从一群客户端接收 RFC3164 系统日志消息并将它们写入文件,然后通过非 TLS RFC5424 TCP 端口 601 将它们转发到 telegraf 以插入 InfluxDB 数据库。
我的 syslog-ng 配置是:
@version: 3.29
@include "scl.conf"
options {
flush-lines(1);
};
source s_network {
udp(ip(0.0.0.0) port(514));
};
destination d_file {
file("/var/log/messages");
};
destination d_telegraf {
syslog("telegraf" port(601) transport(tcp));
};
log {
source(s_network);
destination(d_telegraf);
destination(d_file);
};
我的电报配置的相关部分如下所示:
[global_tags]
[agent]
interval = "100ms"
round_interval = true
metric_buffer_limit = 10000
flush_buffer_when_full = true
collection_jitter = "0s"
flush_interval = "100ms"
flush_jitter = "0s"
debug = true
quiet = false
[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "logs_db"
[[inputs.syslog]]
server = "tcp://telegraf:601"
本质上,syslog-ng 被设置为通过 TCP 连接将 syslog 条目转发到 telegraf。
问题是我发现 syslog-ng 经常遭遇来自 telegraf 的 TCP 断开连接。这些在 syslog-ng 日志中显示为:
[2021-11-17T02:55:32.662972] EOF occurred while idle; fd='12'
[2021-11-17T02:55:32.663102] Syslog connection closed; fd='12', server='AF_INET(192.168.0.6:601)', time_reopen='60'
[2021-11-17T02:56:32.719139] Syslog connection established; fd='12', server='AF_INET(192.168.0.6:601)', local='AF_INET(0.0.0.0:0)'
当我使用以下命令向 syslog-ng 发送日志时,通常会触发此断开连接:
logger -i -d --server localhost test
但如果我只是让它闲置,我也会得到:
[2021-11-17T02:57:05.392356] EOF on control channel, closing connection;
在这些情况下,192.168.0.6 是 telegraf 服务器。
虽然我可以设置选项time-reopen(1)
来加快重新连接的速度,但我更愿意首先找到根本原因并防止断开连接。
syslog-ng 和 telegraf 之间是否存在不兼容性,从而导致此 EOF 和不正常断开连接?
所有这些都在单个主机上的 docker-compose 堆栈中运行。
编辑:我已经开始调查RFC5424和RFC6587。使用 Wireshark 嗅探 syslog-ng 中发往 telegraf 的数据包,我确定这些数据包使用的是八位字节填充(又称非透明帧),而不是八位字节计数,这是 telegraf 默认期望的。发往 telegraf 的每条 syslog 消息的有效负载都以“<”字符开头,而不是整数。
我假设 telegraf 正在接受这些消息,但在解析它们时卡住了,因此关闭了连接。关闭连接的第一个 FIN 来自 telegraf。
不幸的是,当我将 telegraf 设置为接受非透明框架时,它会拒绝整个条目,而我还没有弄清楚原因。
我还没有弄清楚如何配置 syslog-ng 以输出具有八位字节计数帧的消息。
但至少 EOF 消息和断开连接不再发生。但如果 telegraf 完全拒绝所有消息,我不确定这是否意味着什么。
答案1
我已经确定 syslog-ng是向 telegraf 发送八位字节计数框架消息。
导致此问题的原因是 telegraf 在 5 秒后断开了与 syslog-ng 的 TCP 连接,而没有收到任何消息。这与 telegraf syslog 插件提供的文档相悖,该文档指出此超时仅适用于接收单条消息的时间,而不适用于消息之间的时间。不过,这可能是英语语言/翻译问题。在 telegraf 配置中设置read_timeout
为0
足以防止 telegraf 断开连接。