请不要费心阅读这个问题。syslog-ng 已默认设置为使用八位字节计数帧发送 RFC5424 消息。我对另一个组件的行为感到困惑。这个问题无效。
我有一个 syslog-ng OSE 配置(v3.31.2):
@version: 3.29
@include "scl.conf"
source s_network {
udp(ip(0.0.0.0) port(514));
};
destination d_network_telegraf {
syslog("telegraf" port(601) transport(tcp));
};
log {
source(s_network);
destination(d_network_telegraf);
};
目的是转发RFC3164在 UDP 端口 514 上接收的格式化系统日志消息,并将其转发为RFC5424格式化的消息通过 TCP 端口 601 发送到 telegraf。
使用此配置,syslog-ng 似乎以 RFC5424 的形式发出转发的消息,并且采用非透明(八位字节填充)帧(消息以 ASCII < 字符开头)。不幸的是,telegraf 期望接收采用八位字节计数帧(消息以数字开头)的消息。RFC6587涵盖这些。
虽然可以将 telegraf 配置为使用非透明帧,但这似乎无法正常工作。在深入研究之前,我想尝试另一种方法,即配置 syslog-ng 以使用八位字节计数帧输出 RFC5424 消息。无论如何,这显然是推荐的帧类型。
但是我在 syslog-ng 文档中找不到任何关于此内容的内容。在几乎所有情况下,文档都讨论了驱动程序的用法syslog
,而input
不是output
,而且几乎没有提及八位字节计数。
是否可以用这种方式配置 syslog-ng?
编辑
这是我正在使用的确切配置:
@version: 3.29
@include "scl.conf"
options {
create-dirs(yes);
flush-lines(1);
time-reopen(60);
};
source s_local {
system();
internal();
};
source s_network {
udp(ip(0.0.0.0) port(514));
};
destination d_local {
file("/data/syslog-ng/var/log/messages");
file("/data/syslog-ng/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};
destination d_network_files {
file("/data/syslog-ng/var/log/messages-network");
file("/data/syslog-ng/var/log/messages-network-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};
destination d_network_telegraf {
syslog("telegraf" port(601) transport(tcp));
};
log {
source(s_network);
destination(d_network_telegraf);
destination(d_network_files);
};
logger -i -d --server localhost this is a test
以下是通过 UDP 端口 514发送给 syslog-ng 的消息:
0000 02 42 ac 15 00 09 02 42 69 3a f6 78 08 00 45 00 .B.....Bi:.x..E.
0010 00 a6 79 e7 40 00 40 11 68 2b ac 15 00 01 ac 15 ..y.@[email protected]+......
0020 00 09 b4 bd 02 02 00 92 58 d8 3c 31 33 3e 31 20 ........X.<13>1
0030 32 30 32 31 2d 31 31 2d 31 38 54 31 32 3a 34 31 2021-11-18T12:41
0040 3a 35 39 2e 39 34 33 39 36 35 2b 31 33 3a 30 30 :59.943965+13:00
0050 20 6b 6f 72 69 6d 61 6b 6f 20 64 61 76 69 64 20 korimako david
0060 36 38 38 31 34 30 20 2d 20 5b 74 69 6d 65 51 75 688140 - [timeQu
0070 61 6c 69 74 79 20 74 7a 4b 6e 6f 77 6e 3d 22 31 ality tzKnown="1
0080 22 20 69 73 53 79 6e 63 65 64 3d 22 31 22 20 73 " isSynced="1" s
0090 79 6e 63 41 63 63 75 72 61 63 79 3d 22 37 39 37 yncAccuracy="797
00a0 30 30 30 22 5d 20 74 68 69 73 20 69 73 20 61 20 000"] this is a
00b0 74 65 73 74 test
以下是 syslog-ng 和 telegraf (TCP 端口 601) 之间捕获的消息:
0000 02 42 ac 15 00 07 02 42 ac 15 00 09 08 00 45 00 .B.....B......E.
0010 00 ec ba 61 40 00 40 06 27 70 ac 15 00 09 ac 15 ...a@.@.'p......
0020 00 07 a7 ab 02 59 be 1c 32 98 d1 f9 90 93 80 18 .....Y..2.......
0030 01 f6 59 19 00 00 01 01 08 0a 0c 3e 2a 2d 7a e2 ..Y........>*-z.
0040 58 de 3c 31 33 3e 31 20 32 30 32 31 2d 31 31 2d X.<13>1 2021-11-
0050 31 37 54 32 33 3a 34 31 3a 35 39 2b 30 30 3a 30 17T23:41:59+00:0
0060 30 20 31 37 32 2e 32 31 2e 30 2e 31 20 31 20 2d 0 172.21.0.1 1 -
0070 20 2d 20 2d 20 32 30 32 31 2d 31 31 2d 31 38 54 - - 2021-11-18T
0080 31 32 3a 34 31 3a 35 39 2e 39 34 33 39 36 35 2b 12:41:59.943965+
0090 31 33 3a 30 30 20 6b 6f 72 69 6d 61 6b 6f 20 64 13:00 korimako d
00a0 61 76 69 64 20 36 38 38 31 34 30 20 2d 20 5b 74 avid 688140 - [t
00b0 69 6d 65 51 75 61 6c 69 74 79 20 74 7a 4b 6e 6f imeQuality tzKno
00c0 77 6e 3d 22 31 22 20 69 73 53 79 6e 63 65 64 3d wn="1" isSynced=
00d0 22 31 22 20 73 79 6e 63 41 63 63 75 72 61 63 79 "1" syncAccuracy
00e0 3d 22 37 39 37 30 30 30 22 5d 20 74 68 69 73 20 ="797000"] this
00f0 69 73 20 61 20 74 65 73 74 0a is a test.
您可以看到,从字节 66 (0x42) 开始的消息以字符<
( <13>1 2021...
) 开头。根据 RFC6587,这不是八位字节计数帧,而是另一种选择:非透明帧。
syslog-ng 此事件的完整日志是:
[2021-11-17T23:41:59.944928] Incoming log entry; line='<13>1 2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="797000"] this is a test'
[2021-11-17T23:41:59.987236] Outgoing message; message='2021-11-17T23:41:59.944+00:00 172.21.0.1 HOST=172.21.0.1 HOST_FROM=172.21.0.1 LEGACY_MSGHDR="1 " MESSAGE="2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"797000\"] this is a test" PROGRAM=1 SOURCE=s_network\x0a'
[2021-11-17T23:41:59.987403] Outgoing message; message='Nov 17 23:41:59 172.21.0.1 1 2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="797000"] this is a test\x0a'
[2021-11-17T23:42:31.994550] Syslog connection established; fd='12', server='AF_INET(172.21.0.7:601)', local='AF_INET(0.0.0.0:0)'
[2021-11-17T23:42:31.994946] Outgoing message; message='<13>1 2021-11-17T23:41:59+00:00 172.21.0.1 1 - - - 2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="797000"] this is a test\x0a'
[2021-11-17T23:42:36.996059] EOF occurred while idle; fd='12'
[2021-11-17T23:42:36.996187] Syslog connection closed; fd='12', server='AF_INET(172.21.0.7:601)', time_reopen='60'
[2021-11-17T23:43:36.996635] Syslog connection established; fd='12', server='AF_INET(172.21.0.7:601)', local='AF_INET(0.0.0.0:0)'
更新 1:我在消息开头发现了缺失的八位字节计数值 - 它位于前面的 TCP 帧中。我认为这意味着 syslog-ng 的输出毕竟使用了八位字节计数帧。我现在正在积极调试 telegraf 源,因为我认为它正在接收消息,但随后错误地关闭了连接。我会在发现更多信息后更新此内容。
更新 2:我确定 telegraf syslog 插件的文档中存在错误或错误,并且会断开任何空闲时间超过 5 秒的传入 TCP 连接。这不是解析问题,只是超时。
因此 syslog-ng 没有问题,整个问题都无效。
答案1
syslog-ng 可以配置为支持所有组合:RFC3164 或 RFC5424 格式,带有或不带有 RFC6587 中定义的框架技术。
syslog()
使用 RFC6587 框架(八位字节计数)并优先使用 RFC5424 作为消息格式,但当 RFC5424 解析失败时,在源端回退到 RFC3164。
network()
无需帧即可运行(无需八位字节计数 - 在 RFC 中这称为“非透明帧”),其默认值为 RFC3164,但可以使用标志进行更改(更改为 RFC5424)flags(syslog-protocol)
。