Thank you for reading this post, don't forget to subscribe!
Логирование одно из самых важных задач системного администрирования.В Линукс системах логи принято хранить в файлах, так называемых файлах логов.Файлы логов - это файлы ,которые хранят сообщения о событиях произошедших в системе и обычно используются системными администраторами для определения проблем произошедших на машине. Обычно все лог файлы хранятся в директории /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) - наивысший уровень (отладка)
Примеры использования фильтров:
1 2 |
kern.* /var/kernel.log |
Все лог сообщения сгенерированные подсистемой ядра с любым уровнем важности записывать в файл /var/log/kernel.log
1 2 |
*.* ~ |
Отбрасывает все лог сообщения и прекращает их обработку.
1 2 |
daemon.err /var/log/error_daemo.log |
Фильтровать и записывать в файл все лог сообщения от источника "daemon" с уровнем важности "err"
Фильтры базирующиеся на свойствах
Синтаксис
1 |
: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 - время когда сообщение было полученно.
Примеры использования:
1 |
:msg, contains, "DHCPREQUEST(lxdbr0)" /var/log/syslog |
Если в теле сообщения встречается данный текст "DHCPREQUEST(lxdbr0)", то записывать сообщение в файл /var/log/syslog
1 |
:fromhost-ip, isequal, "192.168.1.1" /var/log/router.log |
Если ip-адрес [хоста от которого полученно сообщение "192.168.1.1", то записать сообщение в файл /var/log/router.log
1 |
:fromhost, regex ".*ubuntu.*" /var/log/ubuntu-servers.log |
Если имя хоста содержит текст "ubuntu", то записать его в файл /var/log/ubuntu-servers.log
Вообщем можно создавать большое разнообразие различных фильтров, для обработки лог сообщений
Фильтры основанные на выражениях:
Синтаксис:
1 |
if EXPRESSION then ACTION else ACTION |
Примеры:
1 2 3 |
if $syslogfacility-text == "local1" and $msg contains "mysql" then /var/log/db.log |
Если facility равно "local1" и cообщение содержит "mysql" то записывать его в файл /var/log/db.log
1 2 3 |
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"
Шаблоны
Шаблоны можно использовать для динамической генерации имен лог файлов
Синтаксис:
1 |
$template имя_шаблона, опции |
Примеры
1 2 3 4 5 |
$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, раскомментировать строки
1 2 3 |
module(load="imudp") input(type="imudp" port="514") |
Для работы по протоколу TCP
1 2 3 |
module(load="imtcp") input(type="imtcp" port="514") |
Возможно работа одновременного по обоим протоколам.
После перезапуска сервер сможет принимать логи от удаленных хостов и обрабатывать их согласно настроенным фильтрам.
Отправка логов на удаленный Rsyslog сервер.
Для отправки логов на другой сервер необходимо вместо лог файла указать конструкцию с @ или @@ и ip-адрес сервера и порт:
Отправлять все логи на 172.20.1.58 по протоколу UDP
1 |
*.* @172.20.1.58:514 |
Отправлять все логи на 172.20.1.58 по протоколу TCP
1 |
*.* @@172.20.1.58:514 |