Логи (журнал сервера, англ. server log) – это записываемые фрагменты данных, описывающие то, что в конкретный момент времени делает сервер, ядро, службы и приложения. Вот пример лога SSH из /var/log/auth.log :
Обратите внимание, что непосредственно перед сообщением лог содержит несколько полей: метка времени, имя хоста, инициатор события и идентификатор процесса.
Логи в Linux поступают из разных источников. Ниже перечислены основные.
Подсистема systemd . Большинство дистрибутивов Linux для управления службами имеют в своём составе systemd. Подсистема инициализации и управления ловит выходные данные служб и записывает их в журнал. Для работы с логами systemd используется система журналирования journalctl (шпаргалка по работе с journalctl):
Сообщения процессов по стандарту syslog. При отсутствии systemd такие процессы, как SSH, могут записывать данные в UNIX-сокет в формате syslog. Демон syslog, например, rsyslog, выбирает сообщение, анализирует и по умолчанию записывает его в /var/log .
Ядро Linux пишет собственные логи в особый буфер. Подсистемы systemd или syslog могут считывать журналы из этого буфера, а затем записывать их в свои журналы или файлы – обычно /var/log/kern.log . Чтобы посмотреть логи ядра, воспользуйтесь dmesg:
Audit logs. Особый случай сообщений ядра, предназначенных для аудита событий, таких как доступ к файлам. Обычно для прослушивания таких журналов безопасности, существует специальная служба, например, auditd, записывающая свои сообщения в /var/log/audit/audit.log .
Журнал приложений. Несистемные приложения имеют тенденцию записывать данные в /var/log :
- Apache (httpd) обычно пишет в /var/log/httpd или /var/log/apache2 . Журналы HTTP-доступа находятся в файле /var/log/httpd/access.log .
- Логи MySQL обычно находятся в /var/log/mysql.log или /var/log/mysqld.log .
- Старые версии Linux могут записывать свои логи загрузки с помощью bootlogd в /var/log/boot или /var/log/boot.log . В современных ОС об этом заботится systemd: вы можете просматривать связанные с загрузкой журналы с помощью journalctl -b . Дистрибутивы без systemd снабжены syslog-демоном, считывающим данные из буфера ядра. Таким образом, вы можете найти свои boot/reboot-журналы в /var/log/messages или /var/log/syslog .
Как правило, вы найдете журналы пингвиньего сервера в каталоге /var/log и подкаталогах. Это место, где syslog -демонам даны полные права на запись. Также это то место, которое у большинства приложений (например, Apache) указано по умолчанию, как место хранения логов.
Для systemd расположение по умолчанию – /var/log/journal , но просматривать файлы логов напрямую не получится – они хранятся в двоичном формате. Как же быть?
Если ваш дистрибутив Linux использует Systemd (как и большинство современных дистрибутивов), то все ваши системные журналы находятся в специальной области journal. Просмотреть их можно с помощью journalctl (наиболее важные команды journalctl).
Если ваш дистрибутив использует syslog, для их просмотра используются стандартные инструменты: cat , less или grep :
Если для управления журналами вы используете auditd , всё найдётся в файле /var/log/audit.log . В поиске и анализе поможет ausearch.
Заметим, что хорошим тоном является хранение всех логов централизованно, в одном месте. Особенно если у вас несколько серверов. Обсудим эту задачу подробнее.
Системные журналы могут находиться в двух местах: в systemd или в обычных текстовых файлах, записанных демоном syslog . В некоторых дистрибутивах, например, Ubuntu, есть и то, и другое: journald настроен на пересылку в syslog . Это осуществляется путем установки ForwardToSyslog=Yes в конфиге journald.conf .
Централизация журналов с помощью Journald
Если в ваш дистрибутив включён systemd, для централизации журналов м ы рекомендуем использовать journal-upload .
Централизация журналов с помощью syslog
Существует несколько случаев, в которых подойдет централизация с применением syslog :
- Если в ваш дистрибутив не включён journald. Это означает, что системные журналы направляются непосредственно в syslog-демон.
- Когда необходимо собирать и анализировать журналы приложений. Например, в случае с журналами для Apache через rsyslog и Elasticsearch.
- Если вы хотите перенаправить записи – ForwardToSyslog=Yes . Для этого в качестве транспорта следует использовать syslog-протокол. Однако подход приведет к потере некоторых структурированных данных journald т. к. он пересылает только поля syslog-specific .
- Когда вы настроили syslog-демон для чтения из журналов (как это делает journalctl). Такой подход не приводит к потере структурированных данных, но более чувствителен к ошибкам (например, в случае повреждения журнала) и увеличивает накладные расходы.
Во всех перечисленных ситуациях информация будут проходить через демон syslog , а оттуда их можно отправить в любое место и использовать на своё усмотрение.
Большинство дистрибутивов Linux поставляются с rsyslog . Чтобы пересылать данные на другой сервер через TCP, добавьте следующую строку в /etc/rsyslog.conf :
Эта строка будет заворачивать данные на сервер example . com. В ы можете заменить logsene-syslog-receiver.[…..] именем своего syslog-хоста.
Некоторые демоны могут выводить данные в Elasticsearch через HTTP/HTTPS. Одним из них является наш rsyslog. Например, если вы юзаете rsyslog на Ubuntu, сначала установите модуль Elasticsearch:
Затем в конфигурационном файле вам потребуется поправить два элемента: ш аблон JSON для Elasticsearch:
и action , который пересылает данные в Elasticsearch , используя указанный выше шаблон:
В приведенном примере показано, как отправлять сообщения в API Elasticsearch на example . com. Н астройте action на ваш локальный Elasticsearch:
- searchIndex – будет вашим алиасом;
- server – имя хоста (ноды) Elasticsearch;
- serverport может быть 9200 или кастомным, главное, чтобы на нем слушал Elasticsearch;
- usehttps=“off” – отправление данных по http.
Независимо от того, используете ли вы syslog-протокол или что-то еще, лучше перенаправлять данные непосредственно из демона, чем искать проблемы в отдельных файлах из /var/log .
Это не значит, что файлы в /var/log бесполезны. Они пригодятся в следующих случаях:
- приложения пишут туда свои логи, например, HTTP, FTP, MySQL и т. д.,
- требуется обработать системные журналы, например, с помощью grep.
Здесь мы рассмотрим ключевые файлы логов, какую информацию они хранят, как настраивается rsyslog для записи и как посмотреть информацию с помощью journalctl .
Журнал /var/log/syslog или /var/log/messages
Это «всеохватывающий» системный лог:
Вы найдёте здесь все сообщения: ошибки, информационные сообщения и все другие серьёзности . Исключением является stop action .
Если в /var/log/syslog или /var/log/messages пусто, скорее всего, journald не перенаправляет данные в syslog. Все те же данные можно просмотреть, вызвав journalctl без параметров.
Журналы /var/log/kern.log или /var/log/dmesg
Сюда по умолчанию отправляются сообщения ядра:
И снова, если у вас нет syslog (или файл пустой/отсутствует) – используйте journalctl:
Журналы /var/log/auth.log или /var/log/secure
Здесь вы найдете сообщения об аутентификации, генерируемые такими службами, как sshd :
Вот ещё один фильтр по значениям auth и authpriv :
Вы можете использовать такие фильтры в journalctl, используя числовые уровни объектов :
Журнал /var/log/cron.log
Сюда отправляются ваши cron-сообщения (jobs-ы, выполняемые регулярно):
С journalctl можно сделать так:
Журнал /var/log/mail.log или /var/log/maillog
Практически все демоны (такие как Postfix, cron и т. д.) обычно пишут свои логи в syslog. Затем rsyslog раскладывает эти логи по файлам:
С помощью journald просматривать журналы можно так:
- Расположение и формат системных журналов Linux зависят от того, как настроен дистрибутив.
- Большинство дистрибутивов имеют systemd, и все логи «живут» там. Чтобы что-то просмотреть и найти, используйте journalctl.
- Некоторые дистрибутивы передают системные журналы в syslog, либо напрямую, либо через journal. В этом случае у вас, скорее всего, есть логи, записанные в отдельные файлы в /var/log .
- Если вы управляете несколькими серверами, вам потребуется централизовать журналирование с помощью специального ПО или использовать собственный ELK-стек.
Логгирование событий невероятно важная и серьёзная штука в любой сфере администрирования и ОС. Рекомендуем отнестись ответственно к данной теме – она будет полезна при дебагинге, разработке и просто в управлении инфраструктурой.