syslog-ng: как настроить отправку сообщений RFC5424 с кадрированием с подсчетом октетов
Пожалуйста, не утруждайте себя чтением этого вопроса. syslog-ng уже настроен для отправки сообщений RFC5424 с кадрированием подсчета октетов по умолчанию. Меня смутило поведение другого компонента. Этот вопрос недействителен.
У меня есть конфигурация OSE syslog-ng (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 в Telegraf через TCP-порт 601.
В этой конфигурации syslog-ng, похоже, отправляет пересылаемые сообщения как RFC5424 с непрозрачным (наполненным октетами) кадром (сообщение начинается с символа ASCII <). К сожалению, телеграф ожидает получения сообщений с фреймами с подсчетом октетов (сообщение начинается с цифры). RFC6587 охватывает их.
Хотя телеграф можно настроить на непрозрачное кадрирование, похоже, это работает неправильно. Прежде чем углубиться в это, я хотел бы попробовать альтернативу, а именно настроить 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
для syslog-ng через UDP-порт 514:
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.@.@.h+......
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 все-таки используют кадрирование с подсчетом октетов. Сейчас я активно отлаживаю источник телеграфа, потому что думаю, что он получает сообщение, но впоследствии ошибочно закрывает соединение. Я буду обновлять это, когда узнаю больше.
ОБНОВЛЕНИЕ 2: Я определил, что плагин системного журнала telegraf содержит ошибку или ошибку в своей документации и отключает все входящие TCP-соединения, которые простаивают более 5 секунд. Это не проблема синтаксического анализа, а просто тайм-аут.
Следовательно, проблем с syslog-ng нет, и весь этот вопрос не имеет юридической силы.
1 ответ
syslog-ng можно настроить для поддержки всех комбинаций: форматов RFC3164 или RFC5424, с методом формирования кадров, определенным в RFC6587, или без него.
syslog()
использует кадрирование RFC6587 (подсчет октетов) и предпочитает RFC5424 в качестве формата сообщения, но возвращается к RFC3164 на стороне источника, когда анализ RFC5424 завершается неудачно.
network()
работает без кадров (без подсчета октетов — в RFC это называется «Непрозрачное кадрирование») и по умолчанию используется RFC3164, но это можно изменить (на RFC5424) с помощьюflags(syslog-protocol)
флаг.