Rsyslog
1 Rsyslog - сервис управления логами
Rsyslog — это очень быстрый, расширяемый сервис для управления логами с огромным количеством возможностей. Среди его возможностей можно отметить поддержку фильтрации контента, а также передачу логов по сетям. Основные возможности:
- Многопоточность;
- TCP, SSL, TLS, RELP;
- Поддержка MySQL, PostgreSQL, Oracle;
- Фильтрация журналов;
- Полностью настраиваемый формат вывода.
Все программы Linux ведут лог путем отправки сообщений об ошибках или своем состоянии с помощью сокета syslog или просто записывая все сообщения в файл, который будет находиться в каталоге /var/log/.
Но важное значение имеет уровень подробности логирования. Вы можете настраивать подробность в каждой отдельной программе или же с помощью syslog. Это поможет уменьшить использование дискового пространства на хранение логов. Но тут нужно найти компромисс между количеством информации и использованием диска.
Например, ядро Linux определяет такие уровни логов, или — как мы будем называть их ниже — приоритеты:
- KERN_EMERG — система неработоспособна;
- KERN_ALERT — нужно немедленно принять меры;
- KERN_CRIT — критическая ошибка;
- KERN_ERR — обычная ошибка;
- KERN_WARNING — предупреждение;
- KERN_NOTICE — замечание;
- KERN_INFO — информационное сообщение;
- KERN_DEBUG — сообщения отладки.
Подобные уровни лога поддерживаются в большинстве программ, которые ведут логи.
Все настройки Rsyslog находятся в файле /etc/rsyslog.conf и других конфигурационных файлах из /etc/rsyslog.d. Вы можете посмотреть существуют ли у вас эти файлы, выполнив:
ls /etc/rsys* rsyslog.conf rsyslog.d/
Основной конфигурационный файл — /etc/rsyslog.conf, в нем подключены все файлы из папки rsyslog.d с помощью директивы IncludeConfig в самом начале файла:
IncludeConfig /etc/rsyslog.d/*.conf
В этих файлах могут содержаться дополнительные настройки, например, аутентификация на Rsyslog-сервере. В главном конфигурационном файле содержится очень много полезных настроек. Обычно он обеспечивает управление локальными логами по умолчанию, но для работы через сеть нужно добавить настройки.
Синтаксис конфигурационного файла очень прост:
$ <переменная> <значение>
Все директивы начинаются со знака доллара, содержат имя переменной, а дальше связанное с ней значение. Так выглядит каждая строка конфигурационного файла. В его первой части размещены общие настройки программы и загрузка модулей. Во второй — ваши правила сортировки и фильтрации лог-файлов.
#### 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
В этом участке загружаются все необходимые модули программы. Существуют четыре типа модулей:
- Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с im;
- Модули вывода — позволяют отправлять сообщения в файлы или по сети, или в базу данных, имя начинается на om;
- Модули фильтрации — позволяют фильтровать сообщения по разным параметрам, начинаются с fm;
- Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с pm.
Модуль imuxsock позволяет сервису получать сообщения из сокета, по умолчанию отключен через опцию SysSock.Use="off".
Модуль imjournal предоставляет возможность импортировать сообщения структурированного журнала из журнала systemd в системный журнал. Обратите внимание, что этот модуль читает базу данных журнала, что считается относительно интенсивной операцией. Таким образом, производительность конфигурации с использованием этого модуля может быть заметно ниже, чем при использовании imuxsock. По умолчанию ограничение скорости активировано и позволяет обрабатывать 20 000 сообщений в течение 10 минут, чего должно быть достаточно для большинства случаев использования. Только если эти структурированные данные необходимы, необходимо использовать imjournal, в противном случае задействуйте модуль imuxsock.
Модуль imklog предназначен для получения сообщения ядра.
Модуль mark позволяет маркировать соединения, или же выводить сообщения о том, что syslog все еще работает. Например, вы можете попросить rsyslog выводить сообщения каждые 20 минут:
MarkMessagePeriod 1200
Дальше идут глобальные директивы:
ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
В этой строке мы указываем, что нужно использовать стандартный формат хранения времени, в секундах с 1970 года.
Дальше следует набор прав разрешений для файлов-журналов, которые будут созданы в вашей системе:
FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022
После создания этих файлов их права можно менять на те, которые вам нужны.
Выше была более общая настройка syslog, ну а теперь правила сортировки логов. Вот набор правил по умолчанию:
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log
Каждое правило имеет свой синтаксис: сначала идет источник и приоритет, затем действие. Если источник и приоритет совпадают, сообщение отправляется в указанный файл. Например, мы можем отправить больше сообщений в лог системы linux /var/messages:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
В этой строке мы выбираем все сообщения уровня info, кроме mail, authpriv и cron. Шаблон mail.none будет означать, что не нужно логировать ни один уровень сообщений. Соответственно конструкция *.info — значит логировать сообщения от всех источников, но только с уровнем info, *.* — это вообще все сообщения, со всеми уровнями.
Источник и приоритет нечувствительны к регистру. Также заметьте, что приоритеты уровней error, warn и panic больше не используются, так как считаются устаревшими. В целом, в качестве источников вы можете использовать:
- auth;
- authpriv;
- cron;
- daemon;
- kern;
- lpr;
- mail;
- mark;
- news;
- security (эквивалентно auth);
- syslog;
- user;
- uucp;
- local0 … local7;
А в качестве приоритетов вы можете применить:
Звездочки на любом месте означают все варианты. Для фильтрации логов могут использоваться не только источник и приоритет, но и более сложные выражения на основе условий и сравнений.
Вы можете выполнять фильтрацию сообщений с помощью такого синтаксиса:
:<поле>, <сравнение>, '<значение>' <путь_к_файлу>
В качестве операции сравнения вы можете использовать такие варианты:
- contains — поле содержит указанное значение;
- isequal — поле должно быть идентичным значению;
- startswith — поле должно начинаться со значения;
- regex — сравнивает поле с регулярным выражением.
Например, отфильтруем сообщения только от определенной программы:
:syslogtag, isequal, 'giomanager:' /var/log/giomanager.log & stop
Кроме того, можно использовать более простой синтаксис, в виде выражения if. Вот основной синтаксис:
if lt;поле> <сравнение> '<значение>' then <путь_к_файлу>
Здесь используются те же самые компоненты, только выглядит немного проще. Например:
if $syslogtag == 'giomanager' then /var/log/giomanager.log
Отправить лог на удаленный сервер достаточно просто, для этого достаточно указать @ и ip-адрес удаленной машины, на которой запущен rsyslog:
*.info;mail.none;authpriv.none;cron.none @xx.xx.xx.xx:514
Здесь 514 — это порт, на котором слушает rsyslog. Настройка rsyslog на прием логов заключается в запуске сервиса с модулями imtcp и imudp. Далее все, что нужно для того, чтобы получить логи с определенной машины, отфильтровать их из общего потока с помощью фильтров:
if $fromhost-ip contains '192.168.1.10' then /var/log/proxyserver.log
Без фильтров сообщения с разных машин будут писаться в один общий лог системы linux в зависимости от того, как вы их распределите.