@ Карта сайта News Автора!

Bog BOS: rsyslog - сервер syslog

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2018.08.30: sysadmin: переработана статья про syslog

Последнее изменение файла: 2018.09.27
Скопировано с www.bog.pp.ru: 2018.11.15

Bog BOS: rsyslog - сервер syslog

rsyslog - сервер протокола syslog, обеспечивающий передачу и хранение сообщений. Один из претендентов на замену "стандартного" сервера sysklogd в Linux (может быть полностью с ним совместим), ответвился в 2004 году. Позволяет принимать сообщения из множества типов источников, обрабатывать их и пересылать и/или записывать множеством способов благодаря модульной структуре. Среди возможностей:

Продвигается фирмой Red Hat, в частности, в RHEL5 включены версии 3.22.1 и 5.8.12 как rsyslog5; в RHEL6 (версии 5.8.10 и 7.4.10 как rsyslog7) и RHEL7 (версии 7.4.7 и 8.24.0 в RHEL 7.4) ставится по умолчанию. Имеется платная поддержка (Adiscon). Лицензия - GPLv3 (Apache license 2.0?). Работает под Linux (Red Hat, Debian, Ubuntu, OpenSUSE, Gentoo), FreeBSD, Solaris, AIX.

Различные версии rsyslog (2, 3, 5, 7 и 8) имеют различный формат конфигурационного файла и архитектуру. Несмотря на попытки обеспечить совместимость безопаснее рассматривать их как различные программы.

Архитектура (v.8)

Сообщения поступают в rsyslog с помощью модулей ввода, поступивщее сообщение (объект "input()") передаётся к набору правил (ruleset, имеется набор по умолчанию RSYSLOG_DefaultRuleset), подходящие правила вызывают действия над сообщением. К набору правил привязывается модуль разбора, который переводит поступившее сообщение во внутренний формат. Каждое правило состоит из фильтра и списка действий (объект 'action(type="тип")'), проверяются по очереди пока не достигнет конца списка или не выполнится действие discard (команда "stop" или "~"). В дополнение к традиционным для sysklogd фильтрам имеются управляющие структуры RainerScript (if, foreach, call, continue). При обработке можно использовать внутренние переменные (Property) и операции над ними (set, unset, reset).

Описания шаблонов (определяются статически при инициализации) позволяют задать для действия выходной формат сообщения или имя файла в дополнение к встроенным шаблонам.

При обработке сообщений используются очереди, сообщения от модулей ввода обрабатываются препроцессором (?) и попадают в главную очередь (main queue, MainMsg), сообщения из главной очереди разбираются, фильтруются и попадают в очереди действий, обработчик действия (action) получает очередное сообщение из очереди (точнее менеджер очереди вызывает обработчик) и обрабатывает его спомощью модуля вывода. Режимы обслуживания (QueueType) очереди: прямой (Direct, без буферизации, по умолчанию для очереди действия), очередь на диске (Disk, буферизация на диске, кусками по 10MB), очередь в памяти (LinkedList и FixedArray (10000 элементов по умолчанию для главной очереди)), очередь в памяти с опорой на файловую систему (disk-assisted memory mode, очередь в памяти и задать файл для хранения).

Программа имеет модульную структуру (загрузка модулей производится из каталога /usr/lib64/rsyslog/ директивой "$ModLoad имя-модуля"):

Реакция на сигналы:

Переменые окружения:

Ключи запуска (v8)

Ключи запуска (/etc/sysconfig/rsyslog, /etc/systemd/system/multi-user.target.wants/rsyslog.service):

Настройка rsyslog.conf (версия 8), старый стиль (basic)

Файл настройки (обычно /etc/rsyslog.conf и файлы каталога /etc/rsyslog.d) может содержать конструкции в стиле basic (sysklogd, но не совсем), в старом стиле rsyslog версий 2, 3 и 5 (legacy, obsolete legacy, директивы начинаются с "$") и в новом стиле версий 6, 7 и 8 (advanced, RainerScript). Некоторые модули не адаптированы к новому (advanced) стилю, некоторые возможности нельзя описать старым стилем (basic). В старом стиле директивы обрабатывались построчно, в новом стиле весь файл - это поток сознания.

Файл настройки в стиле basic представляет собой набор правил маршрутизации сообщений. Комментарии начинаются с символа '#'. Обратная косая черта в конце строки означает продолжение правила на следующей строке. Каждое правило состоит из селектора и действия, которые разделяются табуляциями или пробелами. Получив сообщение rsyslog для каждого правила проверяет не подходит ли сообщение под шаблон, определяемый селектором. Если подходит, то выполняется указанное в правиле действие. Для одного сообщения м.б. выполнено произвольное количество действий (т.е. обработка сообщения не прекращается при первом успехе).

Селектор состоит из двух частей, разделенных точкой: источник сообщения и уровень серьезности. Прописные и строчные буквы не различаются. Можно также использовать числа (см. /usr/include/syslog.h). Кроме определенных в syslog(3) источников, можно указывать mark (регулярные временные метки), security (устаревший синоним для auth). Кроме определенных в syslog.h уровней серьезности можно использовать warn (синоним для warning), error (синоним для err), panic (синоним для emerg). Сообщения с уровнем, равным или выше указанного в селекторе, и источником, равным указанному в селекторе, считается подходящим. Звездочка перед точкой соответствует любому источнику, после точки - любому уровню. Слово none после точки - никакому уровню для данного источника. Можно указывать несколько источников в одном селекторе через запятую. В этом случае приоритет можно указывать только для последнего источника. В одной строке можно указывать несколько селекторов через ';', проверяются слева направо, последующий может отменить действие предыдущих (если использовать позитивные селекторы, то выполняется логическое ИЛИ, если негативные (none и восклицательный знак), то логическое И). Перед уровнем можно поставить знак равенства - селектору будут соответствовать только сообщения с указанным уровнем (но не с высшим); восклицательный знак - не будут соответствовать сообщения с уровнем равным или большим; восклицательный знак и равенство - не будут соответствовать сообщения с уровнем, равным указанному.

В качестве действия можно указывать:

Настройка rsyslog.conf (версия 8), новый стиль (advanced)

В стиле advanced комментарии начинаются с символа '#' до конца строки или начинаются с "/*" и заканчиваются "*/".

Файл представляет собой набор общих директив (глобальные параметры, загрузка модулей - 'module(load="имя-модуля")'), описаний шаблонов (формат сообщений, имена файлов - 'template(name="имя" type="тип" опция="значение") {...}"), описаний наборов правил ("ruleset(...)") маршрутизации сообщений (фильтр, действие), описаний вводов (input()), связывающих модули ввода с набором правил.

Конфигурационные объекты (в 8.33 каждому конфигурационному объекту добавлен параметр config.enabled, позволяющий его выключить и включить - on)

Фильтр сообщений для правил маршрутизации можно задать следующими способами:

Типы шаблонов

Строчные константы записываются как 'строка', "строка", `echo переменная-окружения` (8.33), `cat имя-файла` (8.33). Маскировка спецсимволов: "\n", "\123", "\xFF".

Для структурированного вывода (например, JSON) предусмотрены параметры format (json, jsonf, jsonr, jsonfr, csv) и outname (имя элемента).

Для преобразования значений переменных имеется множество параметров: dateformat (date-utc, date-mysql, date-rfc3164, date-rfc3164-buggyday, date-rfc3339, date-unixtimestamp, date-year, date-month, date-day, date-hour, date-minute, date-second, date-subseconds, date-ordinal, date-week, date-week, date-wdayname), date.inUTC, caseconversion (lower, upper), controlcharacters (escape, space, drop), securepath, position.from, position.to, position.relativeToEnd (yes, no), fixedwidth (yes, no), compressspace, field.number, field.delimiter, regex.type (ERE, BRE), regex.expression, regex.nomatchmode, regex.nomatchmode, regex.submatch, droplastlf, mandatory (on, off).

Опции шаблонов позволяют стандартные адаптирующие преобразования для результатирующей строки: option.sql, option.stdsql, option.json, option.jsonf, option.casesensitive.

Стандартные шаблоны: RSYSLOG_TraditionalFileFormat (грубое время без часового пояса), RSYSLOG_FileFormat (точное время с часовым поясом), RSYSLOG_TraditionalForwardFormat, RSYSLOG_SysklogdFileFormat, RSYSLOG_ForwardFormat, RSYSLOG_SyslogProtocol23Format (почти RFC 5424), RSYSLOG_DebugFormat.

Переменные используются в шаблонах и условных командах. Делаются (терминология RFC 3164, кроме последних) из сообщений: msg, rawmsg, rawmsg-after-pri, hostname или source, fromhost (используется DNS), fromhost-ip, syslogtag, programname, pri, pri-text, syslogfacility, syslogfacility-text, syslogseverity, syslogseverity-text, timegenerated (точное время прибытия), timestamp или timereported (из сообщения), protocol-version, structured-data, app-name, procid, msgid, inputname (имя модуля ввода, не всегда правильное, для внутренних сообщений rsyslog - "rsyslogd"), jsonmesg. Имеются также системные переменные ($bom, $myhostname, $now, $year, $month, $day, $hour, $minute, $now-utc и пр.).

Значения переменных используются с помощью конструкции Property Replacer: '%имя:начало:конец:преобразователь%'. Нумерация символов с 1, номер последнего символа обозначается как '$'. Можно вырезать из переменной по шаблону регулярного выражения, если в поле 'начало' поместить букву 'R', а в поле 'конец' - регулярное выражение, сразу за которым - строку '-end'. За буквой 'R' можно указать параметры регулярного выражения через запятую:

Также можно поделить переменную на поля, если в поле 'начало' поместить букву 'F,десятичный-код-символа-разделителя', а в поле 'конец' - номер поля (нумерация с 1). Символ '+' после кода позволяет рассматривать несколько подряд идущих разделителей как 1.

Преобразователи (можно указать несколько через запятую): uppercase, lowercase, fixed-width (дополнение пробелами), json, jsonf:имя-поля, csv (RFC 4180), drop-last-lf, date-utc, date-mysql, date-rfc3164, date-rfc3164-buggyday, date-rfc3339 ("1996-12-19T16:39:57-08:00"), date-unixtimestamp, date-year, date-month, date-day, date-hour, date-minute, date-second, date-second, date-tzoffshour, date-tzoffsmin, date-tzoffsdirection, date-ordinal (номер дня в году), date-week, date-wday, date-wdayname, escape-cc (заменить управляющие символы ASCII на "#десятичный-код"), space-cc (на пробел), drop-cc, compressspace (последовательность пробелов на пробел), sp-if-no-1st-sp (хак в борьбе с реализацией RFC 3164), secpath-drop (удалить все '/'), secpath-replace (заменить все '/' на '_').

RainerScript - безтиповый язык, преобразования типов проводятся автоматически. Значение переменной (Property) используется в виде '$имя'. Локальные (относительно сообщения) переменные представляют собой элемент или структуру (дерево), корень которого обозначается как '$.имя' ('$.' - список имён и значений всех переменных), их можно изменять командами set, unset и reset: 'set $.имя = выражение;'. Выражения используют операторы в порядке убывания приоритета: выражение в скобках, not, унарный -, *, /, %, +, _, & (конкатенация), ==, !=, <> <, >, <=, >=, contains, contains_i (не чувствительно к регистру), startswith, startswith_i, and, or. Встроенные функции (дополнительные функции могут быть загружены в модуле, имя которого начинается с fm, например, fmhash в версии 8.37?):

Управляющие структуры RainerScript включают

Типы параметров:

Глобальные параметры (ранее устанавливались как "$имя значение"):

Параметры очереди (используются при описании acion() и главной очереди, а также ruleset()

Действия реализуются с помощью модулей вывода (om*), описываются директивами action, параметрами которой являются описание очереди (queue.*), специфические параметры модуля и следующие параметры:

Модуль вывода omfile обрабатывает разобранные сообщения и записывает их в файл. Модуль ведёт счётчики статистики кеширования динамических файлов (отдельно для каждого шаблона и действия): request (всего запросов), level0 (запросов для текущего файла), missed (файл не найден в кеше), evicted (файл пришлось выбросить из кеша - повод для увеличения), maxused (использовано элементов кеша - повод для уменьшения кеша), closetimeouts (файлов было закрыто по неиспользованию). Параметры загрузки модуля omfile ('module(load="builtin:omfile" ...)'; параметры в старом стиле не действуют):

Входные параметры модуля omfile:

Модуль вывода omfwd обрабатывает разобранные сообщения и пересылает их по UDP или TCP. Модуль встроенный. Входные параметры модуля omfwd:

Модуль вывода omjournal обрабатывает разобранные сообщения и пересылает их в systemd-journal. Входные параметры модуля omjournal:

Модуль вывода ommail обрабатывает разобранные сообщения и пересылает их по email (прямая посылка по SMTP без аутентификации и прочего, так что рекомендуется организовать очередь). Входные параметры модуля ommail:

Модуль вывода ompipe обрабатывает разобранные сообщения и пересылает их в поименованный канал (pipe, fifo): Модуль встроенный. Входные параметры модуля ompipe:

Модуль вывода omudpspoof обрабатывает разобранные сообщения и пересылает их по UDP с подделанным исходящим адресом. Входные параметры модуля omudpspoof:

Модуль вывода omprog обрабатывает разобранные сообщения и подаёт их на вход stdin указанной программе. При завершении программы она перезапускается. При завершении rsyslogd на вход программы подаётся конец файла. Входные параметры модуля omprog:

Модуль вывода omusrmsg обрабатывает разобранные сообщения и посылает их на терминалы пользователей. Модуль встроенный. Входные параметры модуля omusrmsg:

Модуль вывода omuxsock обрабатывает разобранные сообщения и передаёт их в сокет. Обратное действие для imuxsock. Входные параметры модуля omuxsock:

Источники сообщений реализуются с помощью модулей ввода (im*), описываются директивами input, параметрами которой являются специфические входные параметры модуля и следующие параметры:

Модуль imuxsock принимает сообщения через сокеты (не более 50) от syslog(3). Модуль ведёт счётчики статистики: submitted, ratelimit.discarded и ratelimit.numratelimiters. Параметры загрузки модуля (многие SysSock.* игнорируются при работе с systemd, который самостоятельно читает /dev/log и понравившееся выдаёт в /run/systemd/journal/syslog?):

Входные параметры модуля imuxsock

Модуль imjournal принимает структурированные сообщения из базы systemd journal, который читает /dev/log (?). Модуль ведёт счётчики статистики: read, submitted, discarded, failed, poll_failed, rotations, recovery_attempts, ratelimit_discarded_in_interval, disk_usage_bytes. Параметры загрузки модуля imjournal:

Модуль imudp принимает сообщения по протоколу UDP (RFC 3164). Можно сконфигурировать несколько приёмников с помощью input(). Модуль ведёт счётчики статистики (отдельно для каждого потока ("imudp(wНомер)" и каждого источника - "имя-источника(адрес:порт)"): submitted, disallowed, called.recvmmsg, called.recvmsg, msgs.received. Параметры загрузки:

Входные параметры модуля imudp:

Модуль imtcp принимает сообщения по протоколу TCP (RFC 6587? RFC 5424 с разделителем LF или Octet Counting?). Шифрование осуществляется сетевым потоковым драйвером (network stream driver) или внешними средствами (stunnel), imgssapi включает функциональность imtcp. Модуль ведёт счётчики статистики (отдельно для каждого источника - "имя-источника(порт)"): submitted. Параметры загрузки:

Входные параметры модуля imtcp:

Модуль imptcp принимает сообщения по протоколу TCP (RFC 6587? RFC 5424 с разделителем LF или Octet Counting?) и через сокеты быстро, но не поддерживает TLS. Шифрование осуществляется внешними средствами (stunnel). Модуль ведёт счётчики статистики (отдельно для каждого источника - "имя-источника(адрес-привязки/порт/IPv4)"): submitted. Параметры загрузки:

Входные параметры модуля imptcp:

Модуль imfile превращает файл из строк (LF) в поток сообщений, пустые строки игнорируются, новые строки обрабатываются по мере поступления, поддерживается ротация входного файла. Информация об уже обработанной части файла может храниться (PersistStateInterval) в файле состояния чтения файла в рабочем каталоге. Параметры загрузки:

Входные параметры модуля imfile:

Модуль imklog принимает сообщения из журнала ядра. Загрузка модуля активирует его. Параметры загрузки:

Модуль imkmsg принимает сообщения ядра из структурированного /dev/kmsg ("уровень,номер,отметка-времени;сообщение\n[ключ/значение]...", см. "dd if=/dev/kmsg iflag=nonblock"). Загрузка модуля активирует его. Несовместим с imklog.

Модуль impstats ничего не принимает, а периодически выводит накопленные значения счётчиков, полученные от других модулей. Модуль ведёт счётчики статистики (см. getrusage): utime, stime, maxrss, minflt, majflt, inblock, outblock, nvcsw, nivcsw, nivcsw. Параметры загрузки:

Счётчики очередей (main Q, очереди наборов правил, очереди действий):

Счётчики действий (действия нумеруются, имён нет):

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

  1. module(load="имя-модуля") # при загрузке содаётся парсер с именем "rsyslog.имя-модуля"
  2. parser(name="имя" type="имя-модуля" параметр="значение") # встроенные модули были "builtin:" теперь можно указывать параметры без загрузки модуля
  3. ruleset(name="test" parser=["rsyslog.rfc5424","rsyslog.rfc3164"] ... { } # это цепочка по умолчанию?

Модули разбора:

Модули модификации используются как модули вывода (изменяют разобранное сообщение перед другими действиями) или разбора (?).

Модуль анонимизации IP адресов mmanon заменяет IP адреса в сообщении на поддельные. Входные параметры:

Модуль mmrm1stspace позволяет удалить первый пробел из msg.

Модуль mmutf8fix исправляет ошибки в последовательности UTF-8. Меняет само сообщение, но не меняет разобранные свойства (properties). Входные параметры:

Модуль mmcount позволяет подсчитать количество соответствующих фильтру сообщений. Результат записывается в json элемент mmcount ("$!mmcount"). Входные параметры:

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

Модуль mmfields извлекает поля и размещает их в формате CEE/lumberjack. Входные параметры:

Модуль mmnormalize позволяет использовать liblognorm (/usr/share/doc/liblognorm/html/index.html) для нормализации. Результат нормализации записывается в формате CEE/lumberjack (например, "%$!hostname%"). Параметр загрузки: allow_regex="off". Входные параметры:

Пример правила из руководства liblognorm:

rule=:%date:date-rfc3164% %host:word% %tag:char-to:\x3a%: no longer listening on %ip:ipv4%#%port:number%

Модуль mmjsonparse позволяет разобрать структурированные сообщения в формате CEE/lumberjack (CEE cookie).

Модуль mmpstrucdata позволяет разобрать структурированные сообщения в формате RFC 5424. Результат нормализации записывается в формате CEE/lumberjack (например, "%$!hostname%") в корень!rfc5424-sd. Входные параметры:

Пример настройки коллектора в новом формате:

global(workDirectory="/var/log/syslog/work")
global(net.ipprotocol="ipv4-only")
#global(net.enableDNS="off")
global(senders.keepTrack="on")
global(senders.timeoutAfter="604800")
global(senders.reportGoneAway="on")
global(senders.reportNew="on")
$AbortOnUncleanConfig on
timezone(id="MSK" offset="+03:00")
timezone(id="MSD" offset="+03:00")
$LocalHostIPIF bond0

main_queue(queue.type="FixedArray" queue.size="100000")

module(load="impstats")
module(load="pmlastmsg")
parser(name="custom.rfc3164" type="pmrfc3164" detect.YearAfterTimestamp="on")
# The imjournal module bellow is now used as a message source instead of imuxsock.
# imuxsock provides support for local system logging (e.g. via logger command)
module(load="imuxsock") 
module(load="imjournal" StateFile="imjournal.state" Ratelimit.Burst="100000")
#module(load="imklog") # reads kernel messages (the same are read from journald)
#module(load="immark")  # provides --MARK-- message capability
module(load="imudp" TimeRequery="1")
module(load="imptcp")

# шаблон для записи в файл в развёрнутом формате
template(name="SyslogRFC5424explained" type="string" string="%timegenerated:::date-rfc3339% %fromhost-ip% <%syslogfacility-text%:%syslogseverity-text%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% %structured-data% %msg%\n") 

# шаблоны для имён файлов (разделение по типам и хостам)
template (name="DynFile-kern" type="string" string="/var/log/syslog/current/kern/%fromhost%.log")
template (name="DynFile-user" type="string" string="/var/log/syslog/current/user/%fromhost%.log")
template (name="DynFile-mail" type="string" string="/var/log/syslog/current/mail/%fromhost%.log")
template (name="DynFile-daemon" type="string" string="/var/log/syslog/current/daemon/%fromhost%.log")
template (name="DynFile-secure" type="string" string="/var/log/syslog/current/secure/%fromhost%.log")
template (name="DynFile-ftp" type="string" string="/var/log/syslog/current/ftp/%fromhost%.log")
template (name="DynFile-cron" type="string" string="/var/log/syslog/current/cron/%fromhost%.log")
template (name="DynFile-news" type="string" string="/var/log/syslog/current/news/%fromhost%.log")
template (name="DynFile-uucp" type="string" string="/var/log/syslog/current/uucp/%fromhost%.log")
template (name="DynFile-syslog" type="string" string="/var/log/syslog/current/syslog/%fromhost%.log")
template (name="DynFile-lpr" type="string" string="/var/log/syslog/current/lpr/%fromhost%.log")
template (name="DynFile-ntp" type="string" string="/var/log/syslog/current/ntp/%fromhost%.log")
template (name="DynFile-unknown" type="string" string="/var/log/syslog/current/unknown/%fromhost%.log")
template (name="DynFile-by-host" type="string" string="/var/log/syslog/current/host/%fromhost%.log")
template (name="DynFile-routers" type="string" string="/var/log/syslog/current/routers/%fromhost%.log")
template (name="DynFile-dns" type="string" string="/var/log/syslog/current/dns/%fromhost%.log")
template (name="DynFile-samba" type="string" string="/var/log/syslog/current/samba/%fromhost%.log")
template (name="DynFile-ldap" type="string" string="/var/log/syslog/current/ldap/%fromhost%.log")
template (name="DynFile-squid" type="string" string="/var/log/syslog/current/squid/%fromhost%.log")
template (name="DynFile-jabber" type="string" string="/var/log/syslog/current/jabber/%fromhost%.log")
template (name="DynFile-ups" type="string" string="/var/log/syslog/current/ups/%fromhost%.log")
template (name="DynFile-boot" type="string" string="/var/log/syslog/current/boot/%fromhost%.log")
template (name="DynFile-systemd" type="string" string="/var/log/syslog/current/systemd/%fromhost%.log")
template (name="DynFile-hardware" type="string" string="/var/log/syslog/current/hardware/%fromhost%.log")
template (name="DynFile-backup" type="string" string="/var/log/syslog/current/backup/%fromhost%.log")

ruleset(name="common") {
  action(type="omfile" dynaFile="DynFile-by-host" dynaFileCacheSize="300" Template="SyslogRFC5424explained")
  if $syslogfacility-text == "kern"
  then { 
    action(type="omfile" dynaFile="DynFile-kern" dynaFileCacheSize="100" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/kern.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "user"
  then {
    action(type="omfile" dynaFile="DynFile-user" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/user.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "mail"
  then {
    action(type="omfile" dynaFile="DynFile-mail" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/mail.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "daemon"
  then {
    if $app-name == "ntpdate"
    then {
      action(type="omfile" dynaFile="DynFile-ntp" dynaFileCacheSize="100" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/ntp.log" Template="SyslogRFC5424explained")
    } else if $app-name == "systemd"
    then {
      action(type="omfile" dynaFile="DynFile-systemd" dynaFileCacheSize="100" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/systemd.log" Template="SyslogRFC5424explained")
    } else if $app-name == "rsyncd"
    then {
      action(type="omfile" dynaFile="DynFile-backup" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/backup.log" Template="SyslogRFC5424explained")
    } else if $app-name == "bacula-dir"
    then {
      action(type="omfile" dynaFile="DynFile-backup" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/backup.log" Template="SyslogRFC5424explained")
    } else if $app-name == "bacula-fd"
    then {
      action(type="omfile" dynaFile="DynFile-backup" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/backup.log" Template="SyslogRFC5424explained")
    } else if $app-name == "chronyd"
    then {
      action(type="omfile" dynaFile="DynFile-ntp" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/ntp.log" Template="SyslogRFC5424explained")
    } else if $app-name == "ntpd"
    then {
      action(type="omfile" dynaFile="DynFile-ntp" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/ntp.log" Template="SyslogRFC5424explained")
    } else if $app-name == "smartd"
    then {
      action(type="omfile" dynaFile="DynFile-hardware" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/hardware.log" Template="SyslogRFC5424explained")
    } else if $app-name == "mcelog"
    then {
      action(type="omfile" dynaFile="DynFile-hardware" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/hardware.log" Template="SyslogRFC5424explained")
    } else if $app-name == "crond"
    then {
      action(type="omfile" dynaFile="DynFile-cron" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/cron.log" Template="SyslogRFC5424explained")
    } else {
      action(type="omfile" dynaFile="DynFile-daemon" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/daemon.log" Template="SyslogRFC5424explained")
    }
  } else if ($syslogfacility-text == "auth" or $syslogfacility-text == "authpriv")
  then {
    action(type="omfile" dynaFile="DynFile-secure" dynaFileCacheSize="300" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/secure.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "syslog"
  then {
    action(type="omfile" dynaFile="DynFile-syslog" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/syslog.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "lpr"
  then {
    action(type="omfile" dynaFile="DynFile-lpr" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/lpr.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "news"
  then {
    action(type="omfile" dynaFile="DynFile-news" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/news.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "uucp"
  then {
    action(type="omfile" dynaFile="DynFile-uucp" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/uucp.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "cron"
  then {
    action(type="omfile" dynaFile="DynFile-cron" dynaFileCacheSize="300" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/cron.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "ftp"
  then {
    action(type="omfile" dynaFile="DynFile-ftp" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/ftp.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "ntp"
  then {
    action(type="omfile" dynaFile="DynFile-ntp" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/ntp.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility == "13"
  then {
    action(type="omfile" dynaFile="DynFile-unknown" Template="SyslogRFC5424explained")
  } else if $syslogfacility == "14"
  then {
    action(type="omfile" dynaFile="DynFile-unknown" Template="SyslogRFC5424explained")
  } else if $syslogfacility == "15"
  then {
    action(type="omfile" dynaFile="DynFile-unknown" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local0"
  then {
    action(type="omfile" dynaFile="DynFile-routers" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/routers.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local1"
  then {
    action(type="omfile" dynaFile="DynFile-dns" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/dns.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local2"
  then {
    action(type="omfile" dynaFile="DynFile-samba" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/samba.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local3"
  then {
    action(type="omfile" dynaFile="DynFile-ldap" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/ldap.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local4"
  then {
    action(type="omfile" dynaFile="DynFile-squid" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/squid.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local5"
  then {
    action(type="omfile" dynaFile="DynFile-jabber" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/jabber.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local6"
  then {
    action(type="omfile" dynaFile="DynFile-ups" Template="SyslogRFC5424explained")
    action(type="omfile" file="/var/log/syslog/current/ups.log" Template="SyslogRFC5424explained")
  } else if $syslogfacility-text == "local7"
  then {
# некоторые модели коммутаторов не позволяют настраивать facility и сыплют в local7
    if ($fromhost-ip == '192.168.173.35') or ($fromhost-ip == '192.168.173.36') or ($fromhost-ip == '192.168.173.37') or ($fromhost-ip == '192.168.173.38') or ($fromhost-ip == '192.168.173.39') or ($fromhost-ip == '192.168.173.40') or ($fromhost-ip == '192.168.173.237') or ($fromhost-ip == '192.168.174.6')
    then {
      action(type="omfile" dynaFile="DynFile-routers" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/routers.log" Template="SyslogRFC5424explained")
    } else {
      action(type="omfile" dynaFile="DynFile-boot" Template="SyslogRFC5424explained")
      action(type="omfile" file="/var/log/syslog/current/boot.log" Template="SyslogRFC5424explained")
    }
  } else {
    action(type="omfile" dynaFile="DynFile-unknown" Template="SyslogRFC5424explained")
  }
#  action(type="omfile" file="/var/log/syslog/all" Template="RSYSLOG_SyslogProtocol23Format")
  action(type="omfile" file="/var/log/syslog/alltext" Template="SyslogRFC5424explained")
#  if $fromhost-ip == '127.0.0.1' then {
  if $fromhost-ip == '192.168.152.24' then {
# локальные сообщения на дублирующий сервер
    action(type="omfwd" template="RSYSLOG_SyslogProtocol23Format" Target="syslog2.cs.niisi.ras.ru" Protocol="tcp" Port="514")
    if $syslogfacility-text == "authpriv" then {
      action(type="omfile" file="/var/log/secure" Template="RSYSLOG_TraditionalFileFormat")
    } else {
      if $syslogfacility-text == "mail" then {
        action(type="omfile" file="/var/log/maillog" Template="RSYSLOG_TraditionalFileFormat")
      } else {
        if $syslogfacility-text == "cron" then {
          action(type="omfile" file="/var/log/cron" Template="RSYSLOG_TraditionalFileFormat")
        } else {
          action(type="omfile" file="/var/log/messages" Template="RSYSLOG_TraditionalFileFormat")
        }
      }
    }
  }
}
ruleset(name="rule3164" parser=["rsyslog.lastline","custom.rfc3164"]) {
  call common
}
ruleset(name="rule5424" parser=["rsyslog.lastline","rsyslog.rfc5424","custom.rfc3164"]) {
  call common
}
$DefaultRuleset rule5424

input(type="imuxsock" UsePIDFromSystem="on" Socket="/run/systemd/journal/syslog" Unlink="off")
input(type="imudp" Name="udp3164" Address="grid0024.cs.niisi.ras.ru" Port="514" DefaultTZ="+03:00" Ruleset="rule3164")
#input(type="imptcp" Name="tcp6857" Address="grid0024.cs.niisi.ras.ru" Port="514" DefaultTZ="+03:00" NotifyOnConnectionClose="on" NotifyOnConnectionOpen="on" Ruleset="rule5424")
input(type="imptcp" Name="tcp6857" Address="grid0024.cs.niisi.ras.ru" Port="514" DefaultTZ="+03:00" NotifyOnConnectionClose="on" Ruleset="rule5424")

Архитектура (v.5)

Имеет модульную структуру (загрузка модулей производится директивой "$ModLoad имя-модуля"):

Между модулем ввода (imtcp) и подлежащим транспортным уровнем можно поместить драйвер потока (Network Stream Drivers), который обеспечивает последовательность, аутентификацию и секретность:

Используемые файлы:

Реакция на сигналы:

В отличие от sysklogd синхронизация выключена по умолчанию. Формат временных отметок при записи в файл по умолчанию изменён. При передаче сообщений на удалённый сервер они предваряются именем хоста (как это обрабатывается logwatch?!), рекомендуется обеспечить совместимость следующим образом:

$template sysklogd,"<%PRI%>%TIMESTAMP% %syslogtag%%msg%"
*.* @192.168.0.1;sysklogd

Принимаемые сообщения могут складываться в главную очередь сообщений (MainMsg, параметры собираются по всему файлу настройки) перед обработкой правил (есть и другие очереди перед каждым действием - Action, отдельная очередь для каждого действия, параметры должны быть определены до описания действия). Типы очередей (QueueType):

Количество потоков обработки очереди выбирается автоматически в зависимости от заполнения очереди (QueueWorkerThreadMinimumMessages, QueueWorkerThreads). Ненужные более потоки уничтожаются при истечении времени неактивности (QueueWorkerTimeoutShutdown). При катастрофическом переполнении очереди (QueueDiscardMark) менее приоритетные сообщения (QueueDiscardSeverity) выкидываются. При длительном переполнении очереди приём новых сообщений останавливается полностью (QueueTimeoutEnqueue) и все входящие сообщения могут выкидываться. Скорость обработки можно замедлять паузами между обработкой сообщений (QueueDequeueSlowdown).

Не меняет права доступа к имеющимся файлам.

Ключи запуска (v5)

Ключи запуска (/etc/sysconfig/rsyslog, /etc/rc.d/init.d/rsyslog):

Настройка rsyslog.conf (версия 5)

Файл представляет собой набор общих директив, директив модулей и правил маршрутизации сообщений. Комментарии начинаются с символа '#'. Обратная косая черта в конце строки означает продолжение правила на следующей строке. Максимальная длина строки - 4KB. Директивы начинаются с символа '$'.

Общие директивы (параметры, описывающие действие должны быть до активизации действия; при задании размера можно использовать суффиксы: k, m, g, t (двоичные) и K, M, G, T (десятичные)):

Директивы модуля imudp:

Директивы модуля imtcp (возможно шифрование и аутентификация с помощью stunnel, gtls или imgssapi):

Директивы модуля imklog:

Директивы модуля immark:

Директивы модуля imuxsock:

Директивы модуля imfile (каждая строка считается сообщением, файл может быть динамически дополняться и подменяться (ротация), можно мониторить до 100 файлов):

Директивы модуля imrelp

Директивы модуля ommail (аутентификация SMTP не поддерживается, вызывается в форме: ":ommail:;имя-шаблона-для-тела-письма", рекомендуется фильтровать сообщения и использовать $ActionExecOnlyOnceEveryInterval):

Директивы модуля omsnmp (версии протокола SNMP - SNMPv1 и SNMPv2c, сообщение заворачивается в OCTED STRING, вызывается в форме: ":omsnmp:"):

Директивы модуля ommysql (при вызове ":ommysql:имя-сервера,имя-БД,имя-пользователя,пароль[;имя-шаблона]" выполняется SELECT с подставленным значением шаблона):

Директивы модуля omlibdbi (при вызове ":omlibdbi:[;имя-шаблона]" выполняется SELECT с подставленным значением шаблона):

Директивы модуля omrelp (при вызове использовать :omrelp:имя-сервера:порт;имя-шаблона)

Каждое правило маршрутизации состоит из селектора и действия, которые разделяются табуляциями или пробелами. Каждое сообщение из главной (входной) очереди проверяется селектором каждого правила. Если подходит, то выполняется указанное в правиле действие. Для одного сообщения м.б. выполнено произвольное количество действий (т.е. обработка сообщения не прекращается при первом успехе). Перед действием отфильтрованные сообщения преобразуются с использованием шаблона вывода (либо шаблона по умолчанию, указанного в директиве, либо явно указанного по имени через точку с запятой после описания действия). Шаблон также может использоваться для генерации самого текста действия с указанием символа '?' перед именем шаблона. Шаблон должен быть определён до использования, иначе селектор будет проигнорирован.

Встроенные шаблоны:

Описание шаблона заключается в кавычки. Обратная косая черта обеспечивает специальное действие следующего символа вида \7 или \n. Текст описания шаблона выводится в результат как есть, кроме переменных (property replacer), заключённых в знаки процента. Внутри знаков процента после имени переменной могут идти начальная и конечная позиция и опции, разделённый двоеточиями. Имена переменных:

Простейший шаблон для использования с модулем ommysql (однако, рекомендуется использовать встроенную схему, совместимую с phpLogCon, createDB.sql):

"insert into syslog(message) values ('%msg%')"

Использование начальной и конечной позиции позволяет выделять подстроку. Нумерация символов начинается с 1. Символ "$" означает конец строки. Если в качестве начальной позиции указать символ "R", то конечная позиция должна содержать регулярное выражение. В конце регулярного выражения необходимо дописать "--end". Имеются модификаторы типа регулярного выражения и что делать при отсутствии совпадения, подробности в документации (property_replacer.html). Если в качестве начальной позиции указать символ "F", то конечная позиция должна содержать номер требуемого поля (нумеруются с 1, разделителем по умолчанию является символ табуляции, можно изменить указав после символа "F" запятую и десятичное значение символя-разделителя. Тема UNICODE не раскрыта.

Опции позволяеь форматировать результат обработки шаблона специальным образом (можно указать несколько опций, разделяя их запятыми):

Селектор состоит из двух частей, разделенных точкой: источник сообщения и уровень серьезности. Прописные и строчные буквы не различаются. Можно также использовать числа (см. /usr/include/rsyslog.h). В качестве источников, можно указывать фuth, authpriv, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, mark (регулярные временные метки), security (устаревший синоним для auth) и от local0 до local7. В качестве уровней серьезности можно использовать debug, info, notice, warning, warn (синоним для warning), err, error (синоним для err), crit, alert, emerg, panic (синоним для emerg). Сообщения с уровнем, равным или выше указанного в селекторе, и источником, равным указанному в селекторе, считается подходящим. Звездочка перед точкой соответствует любому источнику, после точки - любому уровню. Перед уровнем можно поставить знак равенства - селектору будут соответствовать только сообщения с указанным уровнем (но не с высшим); восклицательный знак - не будут соответствовать сообщения с уровнем равным или большим; восклицательный знак и равенство - не будут соответствовать сообщения с уровнем, равным указанному. Можно использовать слово none после точки - селектору не будут соответствовать сообщения никакого уровня для данного источника. Можно указывать несколько источников в одном селекторе (через запятую). В этом случае приоритет можно указать только для последнего источника. В одной строке можно указывать несколько селекторов через ';'. Семантика не ясна (не описана): если использовать позитивные селекторы, то выполняется логическое ИЛИ, если негативные (none и восклицательный знак), то логическое И.

В качестве действия можно указывать:

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

В качестве селектора можно использовать значения переменных (property) в следующем формате:
:имя-переменной,[!]{contains|isequal|startswith|regex},"строка"
Прописные и строчные буквы различаются. Обратная косая черта маскирует последующий символ (в текущей реализации - '"' и '\').

В качестве селектора можно использовать выражения на бестиповом скриптовом языке RainerScript (Rainer - фамилия разработчика rsyslog) с использованием логических (not, and, or), арифметических (*, /, %, +, -) и строковых (contains, contains_i, startswith, startswith_i, &) операций, а также сравнений (==, !=, <>, <, >, <=, >=) с учётом приоритетов и скобок в следующем формате:
if выражение then действие
Значения переменных извлекаются использованием символа '$', за которым указывается имя переменной.

Специальный селектор '&' повторяет действие предыдущего селектора.

Жаль, что авторы не уделили времени проектированию перед началом реализации, а исходили из списка пожеланий пользователей.

История

Отличия 5.8.10 от 3.22.1

Отличия 7.4.10 от 5.8.13

Отличия 8.24 от 7.4.10

Отличия 8.38 от 8.24

Ссылки

@ Карта сайта News Автора!

Bog BOS: rsyslog - сервер syslog

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2018.08.30: sysadmin: переработана статья про syslog

TopList

Copyright © 1996-2018 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)