Rsyslog

Rsyslog -- утилита с открытым исходным кодом используемая на UNIX иUnix-подобных системах для передачи сообщения журнала в сети. Реализует базовый протокол системного журнала, расширяет его при помощи content-based filtering, rich filtering capabilities, и добавляет функции, такие как использование TCP для транспорта. И все это называется как: rocket-fast system for log processing

Rsyslog стал дефолтным пакетом в большинстве дистрибутивов Linux.

Rsyslog полностью соответствует протоколу syslog, описанному в RFC syslog, а так же содержит некоторые дополнительные фичи,упомянутый TCP транспорт, фильтрацию и сортировку сообщений, хранение сообщения в СУБД, шифрование и мн.др. (Ведение логов syslog, logger --> PDF)

HOWTO install rsyslog

Предпологая, что rsyslog установлен по умолчанию размещение файлов в Debian будет следующее: файл задает опции, передаваемые демону rsyslogd при запуске

/etc/default/rsyslog стартовый скрипт

/etc/init.d/rsyslog настройки ротации логов

/etc/logrotate.d/rsyslog основной конфиг

/etc/rsyslog.conf библиотеки для работы сислога

/usr/lib/rsyslog/* бинарник демона, который работает в фоне

/usr/sbin/rsyslogd

/dev/log unix сокет для получения локальных логов

/var/run/rsyslogd.pid pid файл для хранения id процесса rsyslogd

Конфигурационный файл /etc/rsyslog.conf в Debian структурирован по следующему принципу: http://ftp.ics.uci.edu/pub/rsyslog_conf.html

  • 1.Модули (Modules)

  • 2.Конфигурационные директивы (Configuration Directives)

  • 3.Шаблоны (template)

  • 4.Правила сортировки (Rule line)

Модули (Modules) rsyslog

Rsyslog имеет модульную архитектуру. Это позволяет удобно расширять функциональность. Модули подразделяются на группы, например некоторые из них:

  • модули ввода - применяются для использования различных источников сообщений, имена начинаются на im (imfile, etc)

  • модули вывода - используются для записи сообщений в различные места (файл, сокет, СУБД...), имена начинаются на om (omsnmp, ommysql, etc)

  • модули парсинга (анализа содержимого) - используются для анализа содержимого, имена начинаются на pm (pmrfc5424, etc)

  • фильтрационные модули - позволяют фильтровать сообщения в соответствии со специальными правилами, имена начинаются на fm

#################

#### MODULES ####

#################

$ModLoad imuxsock # обеспечивает поддержку локальной системы логирования (читай - из /dev/log)

$ModLoad imklog # обеспечивает поддержку журналирования ядра

#$ModLoad immark # обеспечивает возможности маркирования сообщений --MARK--

# обеспечивает получение сислог-сообщений через сеть по UDP

$ModLoad imudp

$UDPServerRun 514

# обеспечивает получение по TCP

$ModLoad imtcp

$InputTCPServerRun 514

Модули постоянно добавляются разработчиками и могут быть написаны любым желающим, со списком основных модулей можно ознакомиться на официальном сайте -->> здесь.

Конфигурационные директивы (Configuration Directives)

Конфигурационные директивы иногда называют глобальными директивами, они задают общие параметры работы демона rsyslogd. Директива имеет формат $Директива параметр

###########################

#### GLOBAL DIRECTIVES ###

###########################

# Задает использование классического timestamp формата (Мес ДД ЧЧ:ММ:СС).

# Для включения unix-формата timestamps, необходимо закомментировать строку.

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Устанавливает права доступа, владельца и группу по умолчанию для лог-файлов.

$FileOwner root

$FileGroup adm

$FileCreateMode 0640

$DirCreateMode 0755

$Umask 0022

# Задает размещение spool и статических файлов (для хранения таких файлов, как очередь сообщений)

$WorkDirectory /var/spool/rsyslog

#

#includ все конфиги в формате *.conf из каталога /etc/rsyslog.d/

$IncludeConfig /etc/rsyslog.d/*.conf

Шаблоны (Templates) rsyslog

http://www.rsyslog.com/doc/v8-stable/configuration/templates.html

http://www.rsyslog.com/doc/rsyslog_conf_examples.html

http://www.rsyslog.com/how-to-bind-a-template/

Важной и ключевой особенностью rsyslogd является возможность использования шаблонов. Template позволяет:

  • 1. задавать формат выводимой информации,

  • 2. использовать динамические имена файлов логов на основании какого-либо правила.

На самом деле, все выходные сообщения в rsyslogd формируются на основе шаблонов. Тут может возникнуть соответствующий вопрос - как же вывод формируется, если не указать никаких шаблонов в rsyslog.conf (ведь по умолчанию не указано никаких шаблонов)? Все просто. Имеются некоторые шаблоны (взятые из совместимые со старой версии syslog и статично прописанные в исходники rsyslog). Подтверждение этого можно найти в файле исходного кода syslogd.c, поиском по строке "template_" (наткнетесь на /*hardcoded standard templates (used for defaults) */). Шаблоны должны быть заданы до использования в правилах.

Cинтаксис template

В целом, структуру шаблона можно представить в следующем виде синтаксисе:

$template имя_шаблона,описание_шаблона[,опции(по_необходимости)]

$template - указывает, что далее пойдет описание шаблона.

имя_шаблона - произвольное значение понятно описывающее, что за шаблон и для чего (имя будет использоваться в правилах для обращения к шаблону).

Опции - может принимать значение sql и sqlstd, это заставляет отформатировать конечный результат выполнения шаблона в вид, пригодный для MySQL или стандартный SQL соответственно (фактически - заменяет некоторые спецсимволы в syslog сообщении в формат, поддерживаемый SQL-сервером). Опции применяются только для шаблонов для вывода в sql.

описание_шаблона заключается в кавычки. В шаблонах в кавычках любой текст воспринимается буквально (как есть), кроме того текста, который заключен в знаки процентов (%текст%). Такой текст является переменной и позволяет "получить доступ" к внутреннему содержимому пришедшего сообщения и тем самым добиться всяких веселых фич по модификации ). Так же, в кавычках может использоваться т.н. escape-последовательности в виде обратной косой черты и некоего символа за чертой (например, \n - новая строка, \7 - ...).

Применение переменных в шаблонах rsyslog %<...........>%. %имя_proper[:начало_строки:конец_строки:опции[:fieldname]]%

имя_proper (оно же имя_свойства, оно же имя_переменной) - задает имя свойства (свойство в данном контексте можно рассматривать как некоторое свойство\поле syslog сообщения, проходящего сквозь демона), вот некоторые наиболее используемые свойства rsyslog:

msg - тело сообщения

hostname - имя хоста\ip из сообщения

fromhost - имя хоста, от которого пришло сообщение

fromhost-ip - адрес хоста, от которого пришло сообщения (127.0.0.1 для локальных сообщений)

syslogtag - имя и номер процесса (" rsyslogd[12125]:"), который выдал сообщение (извлекается из сообщения)

programname - имя процесса, который выдал сообщение (извлекается из сообщения)

pri - источник и приоритет, в виде числа

pri-text - декодированные источник и приоритет (facility.priority, например syslog.emer)

syslogfacility - только источник в виде числа

syslogfacility-text - только декодированный источник ("local0")

syslogseverity - только приоритет в виде числа

syslogseverity-text - только декодированный уровень ("debug")

timegenerated - время получения (с высоким разрешением)

timereported - время, извлечённое из сообщения

inputname - имя входного модуля

$hour, $minute - текущее время

$myhostname - имя хоста обработки

и тд .....

Как видно, некоторые свойства начинаются с знака $ - они считаются локальными\системными. Значения начало_строки:конец_строки - мозговыносящие. Победить их можно где-то тут. Кратко - они используются для регулярных выражений.

Далее - опции. Опции позволяют модифицировать переменную в границе от знака процента до знака процента. Можно применять одновременно несколько опций, через запятую. Если указать несколько противоречащих (например uppercase, lowercase), то будет применена последняя указанная (lowercase). Вот некоторые опции:

uppercase - преобразование к верхнему регистру

lowercase - преобразование к нижнему регистру

date-mysql - преобразовать в формат даты MySQL

space-cc - заменить управляющие символы пробелами

drop-cc - удалить управляющие символы

и тд ........

fieldname - данное поле доступно с версии 6.3.9+ и имеет очень специфичный характер. Можно ее забыть...

Как видно из приведенного выше шаблона переменной, значения из фигурных скобок указываются по желанию, то есть можно указать просто, например %hostname%. Но если будут применяться опции, то необходимо указать и предыдущие пустые поля, например %hostname:::lowercase%. Между двоеточиями пропущены поля начало_строки и конец_строки. При этом, fieldname почему-то в качестве пустого - не указывается.

Шаблоны, которые хардово запрограммированы в rsyslog (но которые можно изменить директивой $ActionFileDefaultTemplate):

RSYSLOG_SyslogProtocol23Format - формат, определённый в проекте стандарта IETF ietf-syslog-protocol-23, соответствует шаблону:

"<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n\"

RSYSLOG_FileFormat - традиционный формат журнала, с добавлением долей секунды и зоны, соответствует шаблону:

"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"

RSYSLOG_TraditionalFileFormat - традиционный формат журнала для записи в файл, соответствует следующему шаблону:

"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n\"

RSYSLOG_ForwardFormat - традиционный формат журнала для передачи с добавлением долей секунды и зоны, соответствует шаблону:

"<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"

RSYSLOG_TraditionalForwardFormat - традиционный формат журнала для передачи на удалённый сервер соответствует шаблону:

"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%\"

Правила сортировки rsyslog (Rule line)

Каждая строка правил сортировки имеет классический формат, как и в обычном syslog. Для понимания, что и как, необходимо почитать статью syslog. Кратко: правило состоит из селекотора и действия, разделенных пробелом или табулятором. Селектор в свою очередь состоит из источника и приоритета. Каждое сообщение сверяется с селектором из каждого правила последовательно, если селектор сообщения и правила совпадает, то выполняется указанное действие. При этом, после первого совпадения - обработка не останавливается. Перед действием, мессадж преобразуется в соответствии с шаблоном (шаблон по умолчанию, заданный в соответствующей директиве (заменяющий шаблон по умолчанию), заданный в данном действии шаблон - один из трех).

К стандартным возможностям селекторов syslog добавились некоторые дополнительные возможности (напомню, что классически селектор - это источник.приоритет, он же facility.priority). В rsyslog в качестве селектора можно использовать значения переменных. В rsyslog применение переменных в селекторе называется Filters (фильтры). Выше в статье, а так же в первой статье о syslog описан классический подход к фильтрации на основе источник.приоритет (т.н."traditional" severity and facility based selectors). Кроме традиционной фильтрации существует следующие виды фильтрации: RainerScript-based filters (фильтрация на основе языка RainerScript - фактически обычный if - then - else), property-based filters (фильтрация на основе свойств сообщения (как в template)). Давайте рассмотрим оба:

Фильтрация RainerScript (RainerScript-based filters)

RainerScript - это классический язык на основе if then else. В rsyslog RainerScript поддерживает вложенность условий, арифметические, логические и строковые операции. В целом, синтаксис следующий:

if условие then блок_действий else блок_действий

Соответственно, if, then - это обязательные операторы, определяющие конструкцию условия, else - по необходимости. блок_действий - может содержать одно действие (action), либо вложенный блок условий. Если блок условий содержит несколько действий, то он заключается в скобки. условие - содержит условие отбора сообщений для блока_действий. В условии можно использовать:

логические выражения (and, or, not), а так же группировку данных выражений в виде: not условие0 and (условие 1 and условие 2).

переменные (properties) - переменные указываются в виде $имя_переменной (например $hostname или $msg)

операции сравнения (== - равно, != - не равно, > - больше, < - меньше, <= - меньше или равно, >= - больше или равно, (!)contains - (не)содержит, (!)startswith - (не)начинается с)

комментарии /* комментарии */ (сомнительный пункт ...нужно ли его экранировать как в bash ???)

Описание языка есть на сайте. Маленький пример фильтра на основе RainerScript:

if $syslogfacility-text == 'local7' and $msg startswith 'CISCO' and ($msg contains 'warn' or $msg contains 'emer') then /var/log/cisco-alarm

фильтрация на основе свойств сообщения (property-based filters)

Давайте рассмотрим данный вид фильтрации. :переменная, [!]операция_сравнения, "искомое_значение" действие

Что у нас тут есть: переменная - в соответствии с переменными,(в данном случае - без % или $), действие выполняемое над сообщением. операция_сравнения - может быть:

contains - проверяет соответствие искомое_значение с любой частью строки в переменная

isequal - проверяет, совпадает (целиком) ли искомое_значение с переменной

isempty - проверяет, является ли переменная пустой (доступна с 6.6.2)

startswith - проверяет, начинается ли переменная с искомое_значение

regex или ereregex - сравнивает содержимое переменной, заданному в искомое_значение регулярному выражению в соответствии с regular и Extended Regular Expression соответственно

Например: :msg, contains, "syslog" будет искать слово syslog в теле.

Существует так же, специальный символ &, который повторяет выполнение прошлого фильтра и запускает действие, указанное после данного символа. Это очень удобно для фильтрации или экономии системных ресурсов, например: # экономим ресурсы:

*.=crit /var/log/somefile

& root

& /var/log/criticalmessages

# фильтруем сообщения

*.* /var/log/allmsgs-incl-informational.log

:msg, contains, "informational" ~

*.* /var/log/allmsgs-no-informational.log

то есть в первом варианте, rsyslogd нет необходимости несколько раз сравнивать селектор. Сообщение просто выполняет 3 действия.

Действия (actions)

Действия rsyslog полностью совместимы с действиями syslog. Так же, стоит учитывать, что в действии rsyslog, кроме стандартный значений syslog, добавились дополнительные (выделены цветом):

/путь/к/файлу - отправить сообщения в простой файл (по умолчанию, rsyslogd умеет сам создавать новые файлы)

?имя_шаблона - вместо классического действия (/путь/к/файлу) в rsyslog можно указывать шаблон, в соответствии с которым будет динамически формироваться новый файл по заданному в шаблоне правилу.

?имя_шаблона;шаблон_фильтра - дополнительно, к шаблону имени файла (?имя_шаблона) возможно преобразовать сообщения поступающие в эти файлы в соответствии с заданным шаблоном фильтра (шаблон_фильтра).

|/путь/к/fifo - отправить в именованный канал

/dev/терминал или /dev/консоль - отправить на указанную консоль\терминал

@имя-хоста-udp[:порт] - отправить на удаленный хост по UDP

@@[модификаторы]имя-хоста-tcp[:порт]- отправить на удаленный хост по TCP, модификаторы указывают:

zцифра - задает gzip сжатие отправляемых пакетов с уровнем сжатия заданным цифрой от 0-9 (9-максимальное)

список пользователей через запятую - отправить на терминал сообщение указанным пользователям

* - отправить всем пользователям (аналог команды wall)

:имя_модуля_вывода:параметры_модуля[:имя_шаблона] - отправляет сообщение в модуль вывода с заданными параметрами и заданным шаблоном (по желанию)

~ (тильда) - после данного символа сообщение будет удалено и дальнейшая обработка не продолжится

^имя_программы[;имя_шаблона] - можно написать свой обработчик сообщений, ему на stdin будет отправлено содержимое в соответствии с шаблоном

=======================================================================

Настройка сервера rsyslog в Debian

В качестве обучения или эксперемента можно воспользоваться rsyslog Configuration Wizard ...для локальной машины будет достаточно и полезно сделать все руками:

для корректной работы rsyslogd необходимо разрешить получение syslog сообщения из сети, подключив соответствующий модуль и задав правило, т.к. по умолчанию, UDP и TCP транспорт на сервере отключен.

*************************************************************

$ cat /etc/rsyslog.conf <http://www.rsyslog.com/doc/rsyslog_conf.html>

# /etc/rsyslog.conf Configuration file for rsyslog.

#

# For more information see

# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html

#

# Default logging rules can be found in /etc/rsyslog.d/50-default.conf

#################

#### MODULES ####

#################

$ModLoad imuxsock # provides support for local system logging

$ModLoad imklog # provides kernel logging support

#$ModLoad immark # provides --MARK-- message capability

# provides UDP syslog reception

$ModLoad imudp

$UDPServerRun 514

# provides TCP syslog reception

$ModLoad imtcp

$InputTCPServerRun 514

# Enable non-kernel facility klog messages

$KLogPermitNonKernelFacility on

###########################

#### GLOBAL DIRECTIVES ####

###########################

#

# Use traditional timestamp format.

# To enable high precision timestamps, comment out the following line.

#

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages

$RepeatedMsgReduction on

#

# Set the default permissions for all log files.

#

$FileOwner syslog

$FileGroup adm

$FileCreateMode 0640

$DirCreateMode 0755

$Umask 0022

$PrivDropToUser syslog

$PrivDropToGroup syslog

#

# Where to place spool and state files

#

$WorkDirectory /var/spool/rsyslog

#

# Include all config files in /etc/rsyslog.d/

#

$IncludeConfig /etc/rsyslog.d/*.conf

*****************************************************************

После задания указанных параметров, необходимо перезапустить\перечитать конфигурационный файл

#service rsyslog restart

# netstat -nap | grep 514

При этом, netstat нам должен показать, что сислог стал слушать соответствующие поры.

# netstat -nap | grep 514

tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 9121/rsyslogd

tcp6 0 0 :::514 :::* LISTEN 9121/rsyslogd

udp 0 0 0.0.0.0:514 0.0.0.0:* 9121/rsyslogd

udp6 0 0 :::514 :::* 9121/rsyslogd

Настройка клиентов syslog

При наличии клиентов добавить в /etc/rsyslog.conf *.* @<адрес клиента>

Хранение журнала rsyslog в СУБД MySQL

#apt-get install rsyslog-mysql

При этом, установщик кладет модуль ommysql.so в каталог /usr/lib/rsysloul/spang/ и запускает мастер настройки, который запрашивает пароль администратора MySQL, создает отдельного пользователя и просит указать для него пароль. Создает соответствующую базу из скрипта /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql. Получившиеся настройки кладет в /etc/rsyslog.d/mysql.conf. В результате получается следующий конфиг:

$ sudo cat /etc/rsyslog.d/mysql.conf

### Configuration file for rsyslog-mysql

### Changes are preserved

module (load="ommysql")

*.* action(type="ommysql" server="localhost" db="Syslog" uid="rsyslog" pwd="1")

Где: localhost --->>адрес сервера

Syslog --->>имя базы

rsyslog --->>имя пользователя

1 --->>пароль