GELF, rsyslog and custom properties

Для централизованного сбора и обработки логов в нашей команде используется Graylog(v2.2.3).
Отправкой логов занимается rsyslog(7.4.7-12.el7).
Все сообщения со всех серверов отправляются в Graylog следующим правилом:

*.* @;RSYSLOG_SyslogProtocol23Format

Все прекрасно, но вкусив прелести фильтрации логов с помощью stream’ов graylog нам стало не достаточно стандартных полей rsyslog.

Собственно появилось желание добавить поля с полезной для нас информацией которая может помочь нам еще гибче фильтровать сообщения.
Самый лучший пример это поле со списком ролей текущего сервера. Так же, rsyslog способен отправлять сообщения в формате GELF(Graylog Extended Log Format) что нам только на руку)

Шаблон

cat /etc/rsyslog.d/40-remote-server.conf
set $!roles="DB,APP1";
set $!dbrole="primary";

template(name="GELF" type="list") {
    constant(value="{\"version\":\"1.1\",")
    constant(value="\"host\":\"")
    property(name="hostname")
    constant(value="\",\"short_message\":\"")
    property(name="msg" format="json")
    constant(value="\",\"timestamp\":\"")
    property(name="timegenerated" dateformat="unixtimestamp")
    constant(value="\",\"level\":\"")
    property(name="syslogseverity")
    constant(value="\",\"facility\":\"")
    property(name="syslogfacility-text")
    constant(value="\",\"roles\":\"")
    property(name="$!roles")
    constant(value="\",\"db-role\":\"")
    property(name="$!dbrole")
    constant(value="\",\"application_name\":\"")
    property(name="app-name")
    constant(value="\"}")
}

*.* @graylog:12201;GELF

constant — это имя поля
property — значение поля. Тут можно указывать встроенные переменные rsyslog полный список которых тут, или использовать собственные переменные. В моем случае переменные описаны в верхней части файла. К сожалению rsyslog не умеет брать переменные среды(environment variables) или как то динамически подгружать их из внешних файлов, например. Это вполне оправданно на мой взгляд т.к. перечитывать переменные среды перед отправкой каждого сообщения — довольно затратно. В общем переменные нужно описывать в conf-файлах и рестартовать rsyslog.

Для нас это не проблема т.к. всей конфигурацией серверов и rsyslog в частности управляет puppet и  если список ролей сервера меняется(puppet’ом) то и конфигурация rsyslog тоже и он перезапускается и работает уже с новыми переменными.

Результат

gelf_rsyslog_all_messagesgelf_rsyslog_message_detailТеперь просматривая сообщения можно видеть роли сервера или искать по их содержимому и использовать в правилах stream’ов.