Логирование одно из самых важных задач системного администрирования.В Линукс системах логи принято хранить в файлах, так называемых файлах логов.Файлы логов – это файлы ,которые хранят сообщения о событиях произошедших в системе и обычно используются системными администраторами для определения проблем произошедших на машине. Обычно все лог файлы хранятся в директории /var/log. Там находятся несколько типов лог файлов хранящих различные сообщения, такие как файлы с системными событиями, файлы относищиеся к сообщения безопасности, пользовательские логи, логи планировщика и многие другие. Большинство лог файлов контролируется демоном rsyslog. Однако в новых дистрибутивах основанных на systemd, за логирование отвечает демон journald, который хранит логи в бинарном формате в оперативной памяти, хотя есть возможность сохраниния логов и на постоянной основе на жестком диске.
Мы будем рассматривать настройку и использование демона Rsyslog.
Rsyslog сервер может быть сконфигурирован в виде клиент-серверной модели, отправлять на другие сервера и получать с других удаленных серверов логи по сети по протоколам TCP и UDP. В качестве удаленных серверов могут использоваться не только Линукс машины, но и различные сетевые устройства, роктеры, свитчи и т.д. При этом Rsyslog может работать как сервер и как клиент одновременно. По-умолчанию используется порт – 514.
Rsyslog фильтрует сообщения для дальнейшего управления. Используются следующие фильтры:
- facility and priority (Источники и приоритеты);
- Фильтры свойств;
- Фильтры основанные на выражениях
Фильтры источников и приоритета
Категории источники:
- auht/authpriv – сообщения процессов аутентификации;
- cron – логи имеющие отношения к планировщику;
- daemon – логи запущенных демонов (сервисов);
- kernel – логи ядра;
- mail – логи почты;
- syslog – логи имеющике отношение к syslog и другим сервисам;
- lpr – логи печати;
- local0-local7 – выделенные для административных целей.
Priority (Приоритеты) – уровень приоритетности (важности) сообщений
- emerg (0) – экстренные;
- alert (1) – тревожные;
- err (3) – ошибки;
- warn (4) – предупреждения;
- notice (5) – уведомления;
- info (6) – информация;
- debug (7) – наивысший уровень (отладка)
Примеры использования фильтров:
kern.* /var/kernel.log
Все лог сообщения сгенерированные подсистемой ядра с любым уровнем важности записывать в файл /var/log/kernel.log
*.* ~
Отбрасывает все лог сообщения и прекращает их обработку.
daemon.err /var/log/error_daemo.log
Фильтровать и записывать в файл все лог сообщения от источника “daemon” с уровнем важности “err”
Фильтры базирующиеся на свойствах
Синтаксис
:property, [!]compare-operation, “value”
Операторы сравнения:
- contains – проверяет содержится ли строка, представленная в значении, в свойстве;
- isequal – проверяет значение и свойство, они должные быть полностью идентичны;
- startswith – проверяет находится ли значение в “value” в начале свойства;
- regex – сравнение с помощью регулярных выражений;
- ereregex – использование расширенных регулярных выражений;
- isempty – является ли свойство пустым (не имеющим значения).
Наиболее полезные типы свойств:
- msg – тело сообщения;
- hostname – имя хоста отправившего сообщение;
- source – алиас hostname;
- fromhost – имя хоста от которого было полученно сообщение (если имя удалось разрешить);
- fromhost-ip – тоже самое, что и fromhost только всегда ip-адрес;
- syslogtag – TAG сообщения;
- programname – имя программы;
- syslogfacility – источник лог сообщения в форме цифры;
- syslogfacility-text – источник лог сообщения в текстовой форме;
- syslogseverity – уровень важности в цифровом виде;
- syslogseverity-text – уровень важности в текстовом виде;
- pri – источник и приоритет в виде числа;
- pri-text – источник и приоритет в текстовом формате;
- timegenerated – время когда сообщение было полученно.
Примеры использования:
:msg, contains, “DHCPREQUEST(lxdbr0)” /var/log/syslog
Если в теле сообщения встречается данный текст “DHCPREQUEST(lxdbr0)”, то записывать сообщение в файл /var/log/syslog
:fromhost-ip, isequal, “192.168.1.1” /var/log/router.log
Если ip-адрес [хоста от которого полученно сообщение “192.168.1.1”, то записать сообщение в файл /var/log/router.log
:fromhost, regex “.*ubuntu.*” /var/log/ubuntu-servers.log
Если имя хоста содержит текст “ubuntu”, то записать его в файл /var/log/ubuntu-servers.log
Вообщем можно создавать большое разнообразие различных фильтров, для обработки лог сообщений
Фильтры основанные на выражениях:
Синтаксис:
if EXPRESSION then ACTION else ACTION
Примеры:
if $syslogfacility-text == “local1” and $msg contains “mysql”
then /var/log/db.log
Если facility равно “local1” и cообщение содержит “mysql” то записывать его в файл /var/log/db.log
if $msg contains “666” then { action(type=”omfile” file=”/var/log/666.log”) }
else { action(type=”omfile” file=”/var/log/non_666.log”) }
Если сообщение содержит в себе текст “666” то записать его в файл “/var/log/666.log”, если нет содержит то записать в файл “/var/log/non_666.log”
Шаблоны
Шаблоны можно использовать для динамической генерации имен лог файлов
Синтаксис:
$template имя_шаблона, опции
Примеры
$template remote_logs,”/var/log/%HOSTNAME%/%PROGRAMNAME%.log”
daemon.* ?remote_logs
Сначала задаем шаблон с именем “remote_logs” потом указываем что запись лог сообщений необходимо вести в файл “/var/log/%HOSTNAME%/%PROGRAMNAME%.log”, где %HOSTNAME% и %PROGRAMNAME% это свойства, грубо говоря переменные, которые зависят от источника лог сообщений. Потом с помощью знака ? и имени шаблона указываем, привязываем шаблон к фильтру сообщений. Получаем, что сообщения с источником сервисов писать в лог файл с названием как у службы и находящийся в директории с именем как у соответсвующего хоста.
Цетрильный сервер Rsyslog
Rsyslog сервер можно настроить на прием лог сообщений от других хостов. Для этого необходимо внести изменения в конфигурационный файл /etc/rsyslog.conf
Для работы по протоколу UDP, раскоментировать строки
module(load=”imudp”)
input(type=”imudp” port=”514″)
Для работы по протоколу TCP
module(load=”imtcp”)
input(type=”imtcp” port=”514″)
Возможно работа одновременного по обоим протоколам.
После перезапуска сервер сможет принимать логи от удаленных хостов и обрабатывать их согласно настроенным фильтрам.
Отправка логов на кдаленный Rsyslog сервер.
Для отправки логов на другой сервер необходимо вместо лог файла указать конструкцию с @ или @@ и ip-адрес сервера и порт:
Отправлять все логи на 172.20.1.58 по протоколу UDP
*.* @172.20.1.58:514
Отправлять все логи на 172.20.1.58 по протоколу TCP
*.* @@172.20.1.58:514