Содержание
Логи — критически важный компонент любой программы или операционной системы. Обычно в них хранятся записи о действиях пользователей, системных событиях, сетевой активности и многом другом, в зависимости от предназначения. Rsyslog — одна из наиболее широко распространенных систем ведения логов для Linux.
Rsyslog – это мощная, безопасная и высокопроизводительная система обработки логов, принимающая данные из различных источников (систем и приложений) и выдающая их в разнообразных форматах. Она представляет собой развитие обычного демона syslog до полнофункциональной системы ведения логов корпоративного уровня. Rsyslog работает по модели «клиент-серевер», поэтому ее можно настроить как клиент и/или сервер для централизованного ведения логов других серверов, сетевых устройств и удаленных приложений. В данном руководстве мы рассмотрим основы работы с rsyslog. В примерах мы будем использовать следующие узлы:
Содержание
Установка и настройка сервера Rsyslog
$ yum install rsyslog
Для Ubuntu/Debian:
$ apt install rsyslog
После установки rsyslog нужно запустить службу, активировать автоматический запуск при загрузке и проверить состояние при помощи команды systemctl.
$ sudo systemctl start rsyslog $ sudo systemctl enable rsyslog $ sudo systemctl status rsyslog
Главный файл конфигурации rsyslog — /etc/rsyslog.con
f. Он загружает модули, определяет глобальные директивы, содержит правила по обработке сообщений логов, а также включает пути ко всем файлам конфигурации в директории /etc/rsyslog.d/
для различных приложений и служб.
$ sudo vim /etc/rsyslog.conf
По умолчанию rsyslog использует модули imjournal и imusock для импорта структурированных записей логов из журнала systemd и для приема через сокеты Unix сообщений системных логов от приложений, запущенных в локальной системе, соответственно.
Чтобы настроить rsyslog как сетевой централизованный сервер ведения логов, нужно установить протоколы (UDP, TCP или оба), которые будут использоваться для приема удаленных сообщений системных логов, а также прослушиваемые порты.
Если вы хотите использовать UDP-соединение, более быстрое, но ненадежное, найдите в файле конфигурации следующие строки, раскомментируйте их и замените 514 на порт, который вы хотите прослушивать. Этот порт должен соответствовать порту, на который клиенты будут отправлять сообщения, мы рассмотрим это ниже при настройке клиента rsyslog:
$ModLoad imudp $UDPServerRun 514
Для использования TCP-соединения (медленнее, но надежнее) найдите и раскомментируйте следующие строки:
$ModLoad imtcp $InputTCPServerRun 514
источник.уровень_важности место_записи_лога
источник: тип процесса или приложения, от которого исходит сообщение, значение может быть auth, cron, daemon, kernel, local0..local7. Использование звездочки (*) означает все источники.
уровень_важности: тип сообщения логов: emerg-0, alert-1, crit-2, err-3, warn-4, notice-5, info-6, debug-7. Использование звездочки означает все уровни важности, если ничего не указывать, предполагается отсутствие уровня важности.
- 0, emerg – система не работоспособна
- 1, alert – система требует немедленного вмешательства
- 2, crit – состояние системы критическое
- 3, err – сообщение об ошибке
- 4, warning – предупреждение о возможной проблеме
- 5, notice – нормальное, но важное событие
- 6, info – информационное сообщение
- 7 , debug – отладочное сообщение
- место_записи_лога: локальный файл или удаленный сервер rsyslog (определенный в формате IP-адрес:порт).
Для сбора логов удаленных узлов мы будем использовать следующий набор правил с шаблоном RemoteLogs. Обратите внимание, что эти правила должны предшествовать правилам обработки локальных сообщений.
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs & ~
Рассмотрим набор правил более подробно. Первое правило в нем следующее: «$template RemoteLogs,”/var/log/%HOSTNAME%/%PROGRAMNAME%.log”». Директива $template дает демону rsyslog команду собирать полученные сообщения из источников и записывать их в отдельные логи в директории /var/logs
в соответствии с именем узла (машины клиента) и источником (программой/приложением), от которых были получены сообщения, что определено соответствующим шаблоном.
Вторая строка «*.* ?RemoteLogs» означает запись сообщений всех уровней важности от всех источников в соответствии с шаблоном RemoteLogs.
Последняя строка «& ~» задает rsyslog прекратить обработку сообщений после их записи в файл. Если не указать «& ~», сообщения будут записаны в локальные файлы. Настройка сервера для нашего примера завершена. Теперь нужно сохранить и закрыть файл конфигурации, а также перезапустить демон rsyslog, чтобы изменения вступили в силу:
$ sudo systemctl restart rsyslog
Далее требуется проверить сетевые сокеты rsyslog. Воспользуйтесь netstat
$ netstat -nap | grep "rsyslog"
Если у вас включена служба SELinux, нужно выполнить следующие команды, чтобы разрешить трафик rsyslog:
$ sudo semanage -a -t syslogd_port_t -p udp 514 $ sudo semanage -a -t syslogd_port_t -p tcp 514
При включенном брандмауэре нужно открыть TCP и UDP порты 514, чтобы разрешить подключение к серверу rsyslog по обоим протоколам:
Для CentOS (брандмауэр firewalld):
$ sudo firewall-cmd --permanent --add-port=514/udp $ sudo firewall-cmd --permanent --add-port=514/tcp $ sudo firewall-cmd --reload
Для Ubuntu (брандмауэр ufw):
$ sudo ufw allow 514/udp $ sudo ufw allow 514/tcp $ sudo ufw reload
Настройка клиента Rsyslog для отправки логов на сервер
Проверьте, запущена ли служба rsyslog на клиентской машине, при помощи следующей команды:
$ sudo systemctl status rsyslog
$ sudo vim /etc/rsyslog.conf
Чтобы демон rsyslog работал как клиент и отправлял все локальные логи на удаленный сервер rsyslog, добавьте следующее правило перенаправления в конце файла, как показано на скриншоте ниже. Номер порта должен соответствовать номеру порта, прописанному в конфигурации сервера:
*. * @@192.168.100.10:514
Приведенное правило будет отправлять сообщения всех уровней важности от всех источников. Для отправки сообщений от конкретного источника, например, auth, воспользуйтесь следующим правилом:
auth. * @@192.168.100.10:514
Сохраните и закройте файл, а также перезагрузите службу rsyslog чтобы изменения вступили в силу.
$ sudo systemctl restart rsyslog
Мониторинг логов на сервере
Последний этап – проверить, действительно ли rsyslog получает сообщения от клиента и сохраняет их в директории /var/log
и формате имя_узла/имя_программы.log. Выполните команду ls, чтобы получить список файлов директории логов и проверьте, есть ли там директории под названием ip-172.31.21.58 (или с соответствующим именем узла вашего клиента).
$ ls -l /var/log/
Если директория существует, проверьте файлы логов в ней следующей командой:
$ sudo ls -l /var/log/ip-172-31-21-58/
Заключение
Rsyslog – высокопроизводительная система обработки логов с архитектурой «клиент-сервер». В данном руководстве рассмотрена базовая установка и настройка. Более подробную информацию о программе и ее конфигурации можно получить в официальной сетевой документации или man-страницах.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Когда в системе происходит та или иная ошибка, нужно выяснить почему она произошла, исправить ее и попытаться сделать так, чтобы такой ошибки больше не было. В этом системным администраторам очень сильно помогает логирование всех ошибок. Например, общие сообщения ядра и программ сохраняются в /var/log/messages.
Но рано или поздно файлы логов становятся слишком большими, они занимают все место на диске и это приводит к новым ошибкам. Поэтому важно контролировать, как и куда сохраняются файлы журналов. На протяжении многих лет в операционной системе Linux используется сервис Syslog для управления логами. В современных версиях применяется его модификация — rsyslog.
В этой статье мы рассмотрим как выполняется установка и настройка rsyslog, рассмотрим основы настройки локального логирования в Linux, а также пойдем дальше и настроем удаленный сбор логов. Эта информация также поможет вам улучшить свои навыки поиска ошибок и неисправностей.
Развитие rsyslog началось в 2004 году, в качестве форка используемого тогда сервиса Syslog. Программа очень быстро набрала популярность среди пользователей и сейчас она поставляется по умолчанию во многих дистрибутивах Linux.
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. Вы можете посмотреть существуют ли у вас эти файлы выполнив:
rsyslog.conf rsyslog.d/
Основной конфигурационный файл — /etc/rsyslog.conf, в нем подключены все файлы из папки rsyslog.d с помощью директивы IncludeConfig в самом начале файла:
В этих файлах могут содержаться дополнительные настройки, например, аутентификация на Rsyslog сервере. В главном конфигурационном файле содержится очень много полезных настроек. Обычно он обеспечивает управление локальными логами по умолчанию, но для работы через сеть нужно добавить настройки. Сначала давайте рассмотрим что представляет из себя этот файл.
Синтаксис конфигурационного файла очень прост:
$переменная значение
Все директивы начинаются со знака доллара, содержат имя переменной, а дальше связанное с ней значение. Так выглядит каждая строка конфигурационного файла. В его первой части размещены общие настройки программы и загрузка модулей. Во второй — ваши правила сортировки и фильтрации лог файлов.
В этом участке загружаются все необходимые модули программы. Существуют четыре типа модулей
- Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с im.
- Модули вывода — позволяют отправлять сообщения в файлы или по сети, или в базу данных, имя начинается на om;
- Модули фильтрации — позволяют фильтровать сообщения по разным параметрам, начинаются с fm;
- Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с pm.
Сначала загружается модуль imuxsock, который позволяет сервису получать сообщения из сокета, а второй imklog получает сообщения ядра. Следующим загружается модуль mark, который позволяет маркировать соединения, или же выводить сообщения о том, что syslog все еще работает. Например, вы можете попросить rsyslog выводить сообщения каждые 20 минут:
Дальше идут глобальные директивы:
В этой строке мы указываем, что нужно использовать стандартный формат хранения времени, в секундах с 1970 года.
Дальше следует набор прав разрешений для файлов журналов, которые будут созданы в вашей системе:
После создания этих файлов их права можно менять, на те, которые вам нужны.
Выше была более общая настройка 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;
А в качестве приоритетов вы можете применить:
- emerg (раньше panic);
- alert;
- crit;
- error (раньше err);
- warn (раньше warning);
- notice;
- info;
- debug;
Как я уже говорил, звездочки на любом месте означают все варианты. Для фильтрации логов могут использоваться не только источник и приоритет, но и более сложные выражения на основе условий и сравнений.
Вы можете выполнять фильтрацию сообщений с помощью такого синтаксиса:
:поле, сравнение,«значение» путь_к_файлу
В качестве операции сравнения вы можете использовать такие варианты:
- contains — поле содержит указанное значение;
- isequal — поле должно быть идентичным значению;
- startswith — поле должно начинаться со значения;
- regex — сравнивает поле с регулярным выражением.
Например, отфильтруем сообщения только от определенной программы:
:syslogtag, isequal, "giomanager:" /var/log/giomanager.log & stop
Кроме того, можно использовать более простой синтаксис, в виде выражения if. Вот основной синтаксис:
if$полесравнение‘значение’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 в зависимости от того как вы их распределите.
В этой статье мы рассмотрели как выполняется настройка Rsyslog в Linux для сбора логов на локальном компьютере, а также передачи их на удаленный сервер. Изначально все кажется очень сложным, но если разобраться, то и это можно настроить.
Обратите внимание, что при использовании rsyslog в качестве сетевого сервера для хранения логов место на диске будет очень быстро уменьшаться. Поэтому лучше применять в дополнение к программе такую утилиту, как Logrotate.
На завершение видео на английском про настройку Logrotate:
Используемые источники:
- https://itproffi.ru/ustanovka-i-nastrojka-rsyslog-v-linux/
- https://losst.ru/nastrojka-rsyslog-v-linux