Я обращаюсь к вам по поводу проблемы с syslog-NG. некоторые из наших устройств (в основном коммутаторы HP и SAN) отправляют сообщения системного журнала, которые, по-видимому, не соответствуют требованиям RFC 5424.
чтобы дать вам несколько примеров:
если я обнюхиваю сетевой интерфейс сервера, мы можем видеть эти «неправильные» сообщения, подобные этому (как вы можете видеть, после PRI мы видим ПРОГРАММУ, затем часовой пояс и поля, разделенные запятыми. вкратце, смешанные поля, отсутствующие поля и т. д. не стандартное сообщение системного журнала):
<190>raslogd: 2017/03/08-16:03:20, [SEC-1203], 53642, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
поэтому в настоящее время я не могу фильтровать эти сообщения. Я попытался определить обычный фильтр и попытаться распечатать такие поля, как MSGHDR, MSG, PRI и т. Д., Но ничего не увидел.
ЕДИНСТВЕННЫЙ СПОСОБ отфильтровать это сообщение - это просто определить внешний интерфейс и файл в качестве вывода без какого-либо шаблона.
например, если я сделаю такой фильтр:
destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); };
log {
source(s_EXTERNAL);
destination(d_INCOMING_ALL);
};
Я могу видеть сообщения в файле журнала, но каким-то образом отформатированные (я полагаю, что syslog-NG их переформатирует):
[root@xxxxxxxxxxxx logs]# grep -i cswc incoming_all.log
Mar 9 09:44:20 cswc-mo8x-hpsan01 raslogd: 2017/03/09-08:34:50, [SEC-1203], 53647, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
[root@xm1p1034vmo logs]#
проблема в том, что я не могу фильтровать эти сообщения таким образом (мы получаем логи с более чем 1000 устройств), мне нужно фильтровать сообщения, поступающие с этих устройств! и единственный способ сделать это - использовать имя хоста (cswc-) или название программы (raslogd)
поэтому я попытался отобразить поля, добавив шаблон в этот файл, например:
destination d_test {
file ("/app/syslog-ng/logs/test_olivier.log"
template("pri=${priority} date=${ISODATE} host=${HOST} program=${PROGRAM} message=${MSG}\n")
);
};
но ничего не работает, ничего не отображается. Я пробовал все поля, MSG, MESSAGE, MSGHDR и т.д .. не могу отображать НИЧЕГО. единственное, что работает - это парсинг без фильтров и шаблонов.
естественно, если я использовал все виды фильтров, как эти ниже, это не сработает (поскольку поля смешаны):
filter f_is_SAN {
host("cswc.*" flags(ignore-case));
};
то же самое для:
filter f_is_SAN {
match(".*cswc.*" flags(ignore-case));
};
какие-либо подсказки о том, как создавать фильтры для этих сообщений, поступающих с этих устройств (по имени хоста или имени программы)?
С уважением,
ммх я нашел решение, которое, кажется, работает
Я повторно использую пункт назначения "локальная копия" в качестве источника
например:
У меня есть обычный фильтр журнала, в котором хранится все копии:
destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); };
log {
source(s_EXTERNAL);
destination(d_INCOMING_ALL);
};
сообщение сохраняется в этой переформатируемой "локальной копии". Затем я могу перечитать этот файл в источнике и применить к нему фильтры. грязно, но работает:
source s_NON_RFC_COMPLIANT { # new source
file("/app/syslog-ng/logs/incoming_all.log" follow-freq(10));
};
....
destination d_INCOMING_ALL {
file("/app/syslog-ng/logs/incoming_all.log"); # old destination where we keep a local copy of EVERYTHING
};
....
log { # local copy of everything
source(s_EXTERNAL);
destination(d_INCOMING_ALL);
};
....
other filters here
....
filter f_is_Network {
host("cswc.*" flags(ignore-case)) # we want to filter on hosts called cswc-something or program raslogd
or program("raslogd" flags(ignore-case));
};
log { # new source for HP stuff here
source(s_NON_RFC_COMPLIANT);
filter(f_is_Network); # add the filters you need
destination(<your_final_destination_here>);
flags(final);
};
На самом деле syslog-ng не переформатирует их, а добавляет правильный заголовок syslog:
9 марта 09:44:20 cswc-mo8x-hpsan01 raslogd: 2017/03 / 09-08: 34: 50, [SEC-1203], 53647, WWN 10: 00: 50: eb: 1a: 6c: 21: 38 | FID 128, INFO, cswc-mo8x-SAN01, Информация для входа: Успешный вход через TELNET / SSH / RSH. IP-адрес: 1.2.3.4
Следующее добавлено системным журналом:
9 марта 09:44:20 cswc-mo8x-hpsan01
Остальное - исходное сообщение:
raslogd: 2017/03 / 09-08: 34: 50, [SEC-1203], 53647, WWN 10: 00: 50: eb: 1a: 6c: 21: 38 | FID 128, INFO, cswc-mo8x-SAN01, Информация для входа: Успешный вход через TELNET / SSH / RSH. IP-адрес: 1.2.3.4
Итак, syslog-ng согласен с вами, что эти сообщения не соответствуют RFC.
Что касается настройки фильтров, это означает, что вам не с чем играть.
Я лично больше привык к rsyslog (где вы можете проверить сообщение с помощью регулярного выражения, например, ища raslogd
- хотя это не обязательно эффективно).
Однако заголовок, который может добавить syslog-ng, дает вам пару вещей, которые нужно сделать:
похоже, что syslog-ng может сообщить имя хоста, которое, как я предполагаю, разрешено из исходного IP-адреса. Таким образом, вы, по крайней мере, можете фильтровать исходный IP-адрес, используя либо хозяин или маска сети:
filter hp_hosts { (host(192.168.0.25)) };
ваш текущий фильтр хоста не работает, потому что в сообщениях нет поля HOST - документы для host
состояние фильтра:
То есть syslog-ng OSE сравнивает выражение фильтра с содержимым макроса $ {HOST}.
однако у вас есть имя хоста (по крайней мере, в вашем примере) в сообщении, поэтому вы можете рассмотреть возможность использования сообщение фильтр.
При этом - для меня, если бы можно было получить список исходных IP-адресов всех этих устройств (и я могу только надеяться на это ради вас), то я бы использовал фильтр сетевой маски - это, вероятно, эффективнее, чем другие варианты.