syslog-ng / telegraf:空闲时发生 EOF - 不兼容?

syslog-ng / telegraf:空闲时发生 EOF - 不兼容?

这是此问题的后续问题上一个问题,之所以创建是因为我发现了更多信息,并且将其作为新问题提出更加清晰。

我正在使用 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 堆栈中运行。


编辑:我已经开始调查RFC5424RFC6587。使用 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_timeout0足以防止 telegraf 断开连接。

相关内容