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

syslog-ng не разбирает сообщения

Я пытаюсь настроить syslog-ng для правильного анализа сообщений, совместимых с RFC5424, но пока без особого успеха. Согласно документации syslog-ng,

Приложение syslog-ng OSE может автоматически анализировать сообщения журнала, соответствующие форматам сообщений RFC3164 (BSD или legacy-syslog) или RFC5424 (IETF-syslog). Если syslog-ng OSE не может проанализировать сообщение, это приводит к ошибке.

Это говорит о том, что syslog-ng не требует дополнительных параметров для фактического анализа этих сообщений. Однако это не так.

Вот соответствующая часть моей конфигурации syslog-ng:

template remote_message {
    template("${R_ISODATE} s=${SDATA} mesg=${MSGONLY}\n");
};

source s_remote {
    tcp(port(514));
    syslog(transport(tcp));
};

destination d_remote {
    file(
        "/var/log/remote.log"
        owner(root)
        group(root)
        create_dirs(yes)
        template(remote_message)
    );
};

log {
    source(s_remote);
    destination(d_remote);
};

Сервер прослушивает порт 514 и получает журналы из удаленных источников, но не анализирует их вообще. Отправив следующее сообщение (скопированное из текст RFC):

<165>1 2003-10-11T22:14:15.003Z sender.computer.org evententry - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] Test message

дает следующую запись журнала:

2016-04-26T16:22:31+02:00 s= mesg=2003-10-11T22:14:15.003Z sender.computer.org evententry - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] Test message

Как видите, сообщение вообще не анализируется. В отличие от документации, это не приводит к ошибке: согласно документации, если on-error опция установлена ​​на fallback-to-stringsyslog-ng должен «записывать сообщение об ошибке во внутренний () источник», но такие журналы не создаются.

У меня такое чувство, что мне здесь не хватает чего-то очень простого, потому что это действительно должно сработать. Что мне не хватает?

ваш источник, похоже, немного неправильно настроен:

source s_remote {
    tcp(port(514));
    syslog(transport(tcp));
};

Фактически это два источника:

  • первая строка прослушивает порт 514 для сообщений RFC3164
  • вторая строка прослушивает сообщения RFC5424 на порту 601 (порт по умолчанию для источника syslog ())

Поэтому, если вы отправляете сообщение RFC5424 на порт 601, оно должно работать (если только какой-либо брандмауэр не препятствует прослушиванию порта 601).

HTH,

Роберт Фекете