Назад | Перейти на главную страницу

невозможно фильтровать плохо отформатированные сообщения в syslog-ng

Я обращаюсь к вам по поводу проблемы с 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-адресов всех этих устройств (и я могу только надеяться на это ради вас), то я бы использовал фильтр сетевой маски - это, вероятно, эффективнее, чем другие варианты.