Skip to content

Rsyslog

Rsyslog — это очень быстрый, расширяемый сервис для управления логами с огромным количеством возможностей. Это не просто системный журнал, а универсальный инструмент, который может принимать данные из множества источников и отправлять их в различные места назначения.

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

Так, в rsyslog существует модуль imjournal, который позволяет получать логи из journald, однако тот же imuxsock, который и используется по умолчанию, также умеет получать логи из journald по сокету, узнавая у systemd, к какому сокету необходимо подключаться (и согласно документации этот метод производительнее первого).

Каталогом по умолчанию для хранения логов является каталог /var/log, в файлы которого записывается вся информация о состоянии системы и используемых программ, а также информация об ошибках. Лог-файлы можно просмотреть, выполнив команду:

Каталог с логами
ls -l /var/log/

Конфигурационный файл rsyslog.conf

Главным конфигурационным файлом сервиса rsyslog является /etc/rsyslog.conf, к нему могут быть подключены другие файлы по маске /etc/rsyslog.d/*.conf.

Файл разделен на 3 основных секции:

  • Modules — содержит параметры, предназначенные для настройки методов работы сервиса с лог-сообщениями;
  • Global derectives — содержит глобальные параметры работы службы rsyslog;
  • Rules — содержит правила сортировки логов.

Секция Modules

В секции Modules загружаются все необходимые модули программы.

Существует четыре типа модулей:

  • Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с im;
  • Модули вывода — позволяют отправлять сообщения в файлы, по сети или в базу данных, начинаются с om;
  • Модули фильтрации — позволяют отфильтровывать сообщения по разным параметрам, начинаются с fm;
  • Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с pm.
Modules
#### MODULES ####

module(load="imuxsock"    # provides support for local system logging (e.g. via logger command)
   SysSock.Use="off")     # Turn off message reception via local log socket;
                          # local messages are retrieved through imjournal now.
module(load="imjournal"   # provides access to the systemd journal
   StateFile="imjournal.state")     # File to store the position in the journal
#module(load="imklog")    # reads kernel messages (the same are read from journald)
#module(load"immark")     # provides --MARK-- message capability

# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
#module(load="imudp")     # needs to be done just once
#input(type="imudp" port="514")

# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp")     # needs to be done just once
#input(type="imtcp" port="514")
  • Модуль imuxsock позволяет сервису получать сообщения от приложений, работающих в локальной системе. По умолчанию отключено прослушивание сокета /dev/log из-за параметра SysSock.Use="off".

  • Модуль imjournal предоставляет возможность импорта сообщений структурированного журнала из журнала systemd в системный журнал. Обратите внимание, что этот модуль читает базу данных журнала, что считается относительно интенсивной операцией. Таким образом, производительность конфигурации с использованием этого модуля может быть заметно ниже, чем при использовании imuxsock. По умолчанию ограничение скорости активировано и позволяет обрабатывать 20 000 сообщений в течение 10 минут, чего должно быть достаточно для большинства случаев использования. Если импорт структурированных данных необходим, используйте imjournal, в противном случае следует задействовать модуль imuxsock.

  • Модуль imklog предназначен для получения сообщений ядра.

  • Модули imudp и imtcp позволяют получать сообщения по сети, по протоколу UDP/TCP на порту 514. Это значит, что один или несколько серверов будут отправлять сообщения в сеть, а этот сервер будет их принимать. Чтобы сервер отправлял сообщения в сеть — нужно соответствующим образом настроить на нем службу rsyslog.

  • Модуль mark позволяет маркировать соединения или выводить сообщения о том, что syslog все еще работает.

Секция Global directives

Глобальные директивы используются для настройки службы rsyslog. Как правило, они указывают значение для конкретной предопределенной переменной, которая влияет на функциональность правил или самой службы rsyslog.

Global directives
#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
  • global(workDirectory="/var/lib/rsyslog") — задает директорию, которая будет использоваться для рабочих файлов службы rsyslog;

  • module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat") — задает стандартный формат хранения времени, в секундах с 1970 года;

  • include(file="/etc/rsyslog.d/*.conf" mode="optional") — задает директорию, которая будет использоваться для дополнительных файлов конфигурации.

Секция Rules

Каждое правило имеет фильтр (источник facility и приоритет severity) и действие. Если фильтр срабатывает — выполняется указанное действие. Источников и приоритетов может быть несколько, их можно разделять точкой с запятой. Каждый следующий фильтр может как сужать, так и расширять условия срабатывания.

  • Источник (Facility) определяет категорию информации, которая логируется. Rsyslogd использует фиксированный список объектов, который не может быть расширен. Это связано с обратной совместимостью с устаревшей службой syslog.
  • Приоритет (Priority) используется для определения серьезности сообщения, которое необходимо залогировать. При указании приоритета по умолчанию с таким приоритетом логируются все сообщения, а так же все сообщения с приоритетом выше текущего.
  • Назначение (Destination) определяет, куда должно быть записано сообщение. Типичными адресатами являются файлы, но модули rsyslog также могут использоваться в качестве места назначения для дальнейшей обработки через модуль rsyslogd.
legacy синтаксис
<источник>.<приоритет>;<источник>.<приоритет>  <действие(назначение)>

Источники Facility

Источники могут принимать следующие значения:

  • auth — все, что связано с авторизацией пользователей, например, login и su (безопасность/права доступа);
  • authpriv — то же самое, что и auth, однако сообщения этой категории записываются в файл, который могут читать лишь некоторые пользователи (категория выделена, потому что принадлежащие ей сообщения могут содержать открытые пароли пользователей, которые не должны попадать на глаза посторонним людям, и, следовательно, файлы протоколов должны иметь соответствующие права доступа);
  • cron — сообщения от системного планировщика;
  • daemon — сообщения от системных служб, которые в отличие от FTP или LPR не имеют специально-выделенных категорий;
  • kern — сообщения ядра;
  • lpr — сообщения от системы печати;
  • mail — сообщения от почтовой системы;
  • mark — присваивается отдельным сообщениям, формируемым службой syslog;
  • security — эквивалентно auth;
  • syslog — система протоколирования может протоколировать сообщения от самой себя;
  • uucp — копирование файлов между компьютерами (Unix-to-Unix CoPy);
  • user — сообщения пользовательских программ;
  • local0 … local7 — зарезервированные категории для использования администратором системы. Категория local7 обычно используется для сообщений, генерируемых на этапе загрузки системы;
  • * — Выбор всех источников.

Приоритеты Priority

Приоритеты могут принимать следующие значения:

  • emerg (раньше panic) — чрезвычайная ситуация, система неработоспособна;
  • alert — тревога, требуется немедленное вмешательство;
  • crit — критическая ошибка (критическое состояние);
  • error (раньше err) — сообщение об ошибке;
  • warn (раньше warning) — предупреждение;
  • notice — информация о каком-либо нормальном, но важном событии;
  • info — информационное сообщение;
  • debug — сообщения, формируемые в процессе отладки;
  • * — выбор всех приоритетов;
  • none — сообщения от источника с любым приоритетом будут исключены для действия.

Действия Destination

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

Действия могут принимать следующие значения:

  • /путь/к/файлу — отправка сообщений в обычный файл;
  • /dev/console — отправка сообщений в терминал или консоль;
  • @xx.xx.xx.xx:514 — отправка сообщений на удаленную машину с помощью UDP;
  • @@xx.xx.xx.xx:514 — отправка сообщений на удаленную машину с помощью TCP;
  • user,user2,root — отправка сообщений пользователям на терминал (разделенный запятыми список пользователей, получающих сообщения).

Правила принято сохранять именно в путях, попадающих под маску /etc/rsyslog.d/*.conf.

Пример правил, заданных по умолчанию:

/etc/rsyslog.d/50-default.conf
# сообщения от источников auth и authpriv с любым приоритетом записываются в файл /var/log/auth.log
auth,authpriv.*           /var/log/auth.log
# сообщения от всех источников, кроме auth и authpriv, с любым приоритетом, записываются в файл /var/log/syslog
*.*;auth,authpriv.none    -/var/log/syslog
# сообщения от источника cron с любым приоритетом записываются в файл /var/log/cron.log; таким образом,
# сообщения от cron будут записаны в файлы /var/log/syslog и /var/log/cron.log
cron.*                    /var/log/cron.log
# сообщения от источника kern с любым приоритетом записываются в файл /var/log/kern.log; таким образом
# сообщения от kern будут записаны в файлы /var/log/syslog и /var/log/kern.log
kern.*                    -/var/log/kern.log
# сообщения от источника mail с любым приоритетом записываются в файл /var/log/mail.log; таким образом
# сообщения от mail будут записаны в файлы /var/log/syslog и /var/log/mail.log
mail.*                    -/var/log/mail.log
# сообщения от источника mail с приоритетом err и выше записываются в файл /var/log/mail.err; таким
# образом эти сообщения будут записаны в файлы /var/log/syslog, /var/log/mail.log, /var/log/mail.err
mail.err                  /var/log/mail.err

# сообщения с приоритетом emerg из любого источника будут отправлены всем пользователям в системе
*.emerg    :omusrmsg:*

Этот метод записи попадает под формат записи legacy, поскольку берет свои корни из оригинальной реализации syslogd. Однако эти же правила можно записать и в advanced методе, который сложнее с точки написания, но проще с точки зрения понимания логики.

advanced синтаксис
auth,authpriv.* {
 action(type="omfile" file="/var/log/auth.log")
}

# Из этого формата видно, что мы можем производить несколько действий за раз для каждого типа логов либо отправлять их разными модулями. 
# Для этого просто требуется добавить новое действие в следующей строке.
auth,authpriv.* {
 action(type="omfile" file="/var/log/auth.log")
 action(type="omfwd" target="remote")
}
# Второе действие отправляет логи на удаленный сервер remote. Получается, что все логи, полученные для facility auth или authpriv,
# будут сохраняться в локальный лог и заодно отправляться на удаленный сервер.

Фильтры на основе свойств

Позволяют фильтровать сообщения, используя свойства hostname, fromhost, fromhost-ip, syslogtag, programname, msg и еще множество других.

синтаксис фильтра
:<переменная>, <операция-сравнения>, "<искомое_значение>" <действие>
пример сравнения
:msg, contains, "error" /var/log/errors.log
:fromhost, regex, ".*ubuntu.*" /var/log/ubuntu-servers.log
:msg, regex, "fatal .* error" /var/log/fatal-errors.log

Переменная могут принимать значение:

  • 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 — имя хоста обработки.

Операция сравнения может принимать значение:

  • contains — проверяет соответствие <искомое_значение> с любой частью строки в переменная;
  • isequal — проверяет, совпадает (целиком) ли <искомое_значение> с переменной;
  • isempty — проверяет, является ли переменная пустой;
  • startswith — проверяет, начинается ли переменная с <искомое_значение>;
  • regex — сравнивает поле с регулярным выражением.

Искомое значение может принимать значение имени программы, службы или источника.

пример правила
:syslogtag, isequal, "wireguard:" /var/log/wireguard.log
&stop
# & stop необходим для того, чтобы остановить регистрацию сообщения после его совпадения.

Фильтры на основе выражений (RainerScript)

Позволяют фильтровать, используя сложные выражения, которые могут включать логические, арифметические и строковые операции.

синтаксис фильтра
if $<переменная> <операция_сравнения> "<искомое_значение>" then <действие> else <действие>
примеры фильтрации
if $msg contains 'ivan' then /var/log/ivan.log

if $programm == 'cron' then stop

if $msg contains "petia" then {
    action(type="omfile" file="/var/log/petia.log")
} else {
    action(type="omfile" file="/var/log/non-petia.log")
}

if ($msg contains "important") then {
   action(type="omfile" file="/var/log/important.log" template="outfmt")
} else if ($msg startswith "slow-query:") then {
   action(type="omfile" file="/var/log/slow-log.log" template="outfmt")
} else {
   action(type="omfile" file="/var/log/general.log" template="outfmt")
}

Шаблоны

Шаблоны позволяют задавать формат выводимой информации и использовать динамические имена файлов логов. Шаблоны должны быть заданы до использования в правилах. Шаблоны, совместимые со стандартными форматами syslogd, жестко запрограммированы в rsyslogd — можно использовать любой из них по имени, например RSYSLOG_FileFormat.

старый способ создания шаблона
$template MyLogFormat,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
новый способ создания шаблона (тип string)
template(name="MyLogFormat" type="string"
    string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
)
новый способ создания шаблона (тип list)
template(name="MyLogFormat" type="list") {
    property(name="timestamp" dateFormat="rfc3339")
    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    property(name="syslogtag")
    property(name="msg" spifno1stsp="on" )
    property(name="msg" droplastlf="on" )
    constant(value="\n")
}

Жестко запрограммированные шаблоны, которые можно использовать

  • RSYSLOG_TraditionalFileFormat — "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
  • RSYSLOG_FileFormat — "%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
  • RSYSLOG_TraditionalForwardFormat — "<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
  • RSYSLOG_SysklogdFileFormat — "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg%\n"
  • RSYSLOG_ForwardFormat — "<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
  • RSYSLOG_SyslogProtocol23Format — "<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"

Шаблоны можно использовать для создания действий с динамическими именами файлов. Например, чтобы записывать сообщения с разных хостов в разные файлы — можно создать следующий шаблон.

старый способ создания шаблона
$template LogFileName,"/var/log/system-%HOSTNAME%.log"
новый способ создания шаблона
template(name="LogFileName" type="string" string="/var/log/system-%HOSTNAME%.log")

Полезная информация

Linux. Служба логирования rsyslog