В systemd используется принципиально иной (по сравнению с традиционным инструментом syslog) подход к логгированию.
В его основе лежит централизация: специализированный компонент journal cобирает все системные сообщения (сообщения ядра, различных служб и приложений). При этом специально настраивать отправку логов не нужно: приложения могут просто писать в stdout и stderr, a journal сохранит эти сообщения автоматически. Работа в таком режиме возможна и с Upstart, но он сохраняет все логи в отдельный файл, тогда как systemd сохраняет их в бинарной базе, что существенно упрощает систематизацию и поиск.
Хранение логов в бинарных файлах также позволяет избежать сложностей с использованием парсеров для разных видов логов. При необходимости логи можно без проблем переконвертировать в другие форматы.
Journal может работать как совместно с syslog, так и полностью заменить его.
Для просмотра логов используется утилита journalctl.
1 |
# timedatectl |
Одним из существенных недостатков syslog является сохранение записей без учёта часового пояса. В journal этот недостаток устранён: для логгируемых событий можно указывать как местное время, так и универсальное координированное время (UTC). Установка времени осуществляется с помощью утилиты timedatectl.
Просмотр списка доступных временных зон
1 |
# timedatectl list-timezones |
Установка нужной временной зоны
1 |
# timedatectl set-timezone zonename |
Проверяем установленные параметры:
1 |
# timedatectl status |
Просмотр логов
1 |
# journalctl |
По умолчанию эта команда выведет записи текущей и предыдущих загрузок (если инструмент journald настроен для сохранения записей от предыдущих загрузок). Некоторые дистрибутивы включают это поведение по умолчанию, а некоторые – нет. Чтобы включить сохранение записей от предыдущих загрузок, необходимо:
1.Отредактировать файл /etc/systemd/journald.conf. Измените значение параметра Storage=, указав persistent.
1 |
# nano /etc/systemd/journald.conf |
1 |
Storage=persistent |
2.Создать постоянный каталог при помощи команды:
1 |
# mkdir -p /var/log/journal |
Просмотр логов с выводом времени в формате UTC(по умолчанию используется локальное время)
1 |
# journalctl --utc |
Фильтрация логов
Отображать логи только с момента последней загрузки системы
1 |
# journalctl -b |
Просмотр логов предыдущих сессий
Просмотреть список предыдущих загрузок
1 |
# journalctl --list-boot |
1 |
0 8921d96f850c4b43823a536f39cee7a8 Sun 2016-10-09 15:33:47 EEST—Sun 2016-10-09 16:01:22 EEST |
Первая колонка – порядковый номер загрузки
Вторая колонка — уникальный идентификатор (ID) загрузки
Третья колонка – дата и время загрузки
Для отображения логов для нужной загрузки можно использовать как первую, так и вторую колонку
1 |
# journalctl -b 0 |
Либо
1 |
# journalctl -b 8921d96f850c4b43823a536f39cee7a8 |
Фильтрация по дате и времени
Для ограничения просмотра логов определенными временными отрезками используются опции
1 |
--since |
1 |
--until |
Временные значения зависят от формата
Например, можно использовать такой формат времени
1 |
YYYY-MM-DD HH:MM:SS |
Вывести все логи начиная с указанной даты и времени
1 |
# journalctl --since "2016-10-09 15:43:00" |
Если не указана дата, то по умолчанию используется текущая дата
Если не указывается время, то по умолчанию используется полночь – 00:00:00
Например, отобразить логи начиная с даты 2016-10-09 и до сегодняшней даты до времени 15:40:00
1 |
# journalctl --since "2016-10-09" --until "15:40:00" |
Также можно использовать относительные имена
«yesterday», «today», «tomorrow», «now»
Например,отобразить логи со вчерашнего дня
1 |
# journalctl --since yesterday |
Отобразить логии начиная с 10 утра сегодняшнего дня и заканчивая тремя часами назад
1 |
# journalctl --since 10:00 --until "3 hours ago" |
Фильтрация по приложениям и службам
Просмотр всех записей в журнале, сделанных службой ntpd
1 |
# journalctl -u ntpd.service |
Просмотр всех записей в журнале, сделанных службой ntpd и только в текущей загрузке системы
1 |
# journalctl -b -u ntpd.service |
Просмотр всех записей в журнале, сделанных службой ntpd только за сегодня
1 |
# journalctl -u ntpd.service --since today |
Фильтрация по процессам, пользователям и группам
Фильтрация по номеру/идентификатору процесса(PID)
1 |
# pstree -pa | grep [n]tpd |
1 |
|-ntpd,506 -u ntp:ntp –g |
1 |
# journalctl _PID=506 |
1 |
# journalctl _PID=506 |
Фильтрация по UID/GID-пользователя
Для просмотра логов процессов, запущенных от имени определённого пользователя или группы, используются фильтры _UID и _GID соответственно
Узнаем от какого пользователя запущена наша служба и узнаем идентификатор этого пользователя
1 |
# ps aux | grep [n]tpd | awk '{print $1}' |
1 |
ntp |
1 |
# id -u ntp |
1 |
38 |
1 |
# journalctl _UID=38 |
Отобразить список пользователей, о которых имеется записи в логах
1 |
# journalctl -F _UID |
Отобразить список групп, о которых имеется записи в логах
1 |
# journalctl -F _GID |
Фильтрация по пути
Просмотреть логи для какого-либо процесса также можно, указав путь к нему
1 |
# journalctl /usr/sbin/ntpd |
С командной journalctl можно использовать и другие фильтры
Просмотреть список всех доступных фильтров
1 |
# man systemd.journal-fields |
Просмотр сообщений ядра
1 |
# journalctl -k |
Либо
1 |
# journalctl --dmesg |
Если совместить флаги -k и -b, можно получить записи ядра только для текущей загрузки
1 |
# journalctl -k -b |
Чтобы просмотреть сообщения ядра для предыдущих сессий, нужно воспользоваться опцией -b и указать один из идентификаторов сессии (порядковый номер в списке или ID):
1 |
# journalctl -k -b -5 |
Фильтрация логов по уровню ошибки
Во время диагностики и исправления неполадок в системе нередко требуется просмотреть логи и выяснить, есть ли в них сообщения о критических ошибках. Специально для этого в journalctl предусмотрена возможность фильтрации по уровню ошибки. Просмотреть сообщения обо всех ошибках, имевших место в системе, можно с помощью опции -p:
Показать все записи приоритетом err и выше(будут выведены все записи с приоритетом error,critical,alert,emergency)
1 |
# journalctl -p err -b |
Эти сообщения можно фильтровать по уровню. В journal используется такая же классификация уровней ошибок, как и в syslog:
Список всех приоритетов,начиная с самого высокого
1 2 3 4 5 6 7 8 |
0 — EMERG (система неработоспособна); 1 — ALERT (требуется немедленное вмешательство); 2 — CRIT (критическое состояние); 3 — ERR (ошибка); 4 — WARNING (предупреждение); 5 — NOTICE (всё нормально, но следует обратить внимание); 6 — INFO (информационное сообщение); 7 —DEBUG (отложенная печать). |
Вместо имени приоритета можно указывать номер приоритета согласно указанному выше списку
Например, вместо имени err укажим его номер 3
1 |
# journalctl -p 3 -b |
Запись логов на стандартный вывод
По умолчанию journalctl использует для вывода сообщений логов внешнюю утилиту less. В этом случае к ним невозможно применять стандартные утилиты для обработки текстовых данных (например, grep). Эта проблема легко решается: достаточно воспользоваться опцией −−no-pager, и все сообщения будут записываться в стандартный вывод:
1 |
# journalctl --no-pager |
После этого их можно будет передать другим утилитам для дальнейшей обработки или сохранить в текстовом файле
Выходной формат вывода логов
Формат вывода логов утилиты journalctl может быть изменен благодаря использованию опции -o
C помощью опции -o можно преобразовывать данные логов в различные форматы, что облегчает их парсинг и дальнейшую обработку
Вывод journalctl в json-формате
1 |
# journalctl -b -u ntpd.service -o json |
Вывод journalctl в json-pretty формате
1 |
# journalctl -b -u ntpd.service -o json-pretty |
Помимо JSON данные логов могут быть преобразованы в следующие форматы:
1 2 3 4 5 6 7 |
cat — только сообщения из логов без служебных полей; export — бинарный формат, подходит для экспорта или резервного копирования логов; short — формат вывода syslog; short-iso — формат вывода syslog с метками времени в формате ISO 8601; short-monotonic — формат вывода syslog c метками монотонного времени (monotonic timestamp); short-precise — формат вывода syslog с метками точного времени (время событий указывается с точностью до микросекунд); verbose — максимально подробный формат представления данных (включает даже те поля, которые в других форматах не отображаются). |
Просмотр информации о недавних событиях
Просмотр последних 30 записей(по умолчанию используется 10 последних записей)
(аналог tail -n 30)
1 |
# journalctl -n 30 |
Просмотр логов в режиме реального времени (аналог tail -f)
1 |
# journalctl -f |
Управлением логгированием
Определение текущего объема логов
1 |
# journalctl --disk-usage |
1 |
Archived and active journals take up 8.0M on disk. |
Ротация лог-файлов
1.Удаление с помощью указания размера (—vacuum-size)
Устанавливаем предельно допустимый размер для хранимых на диске логов
Как только объём логов превысит указанную цифру, лишние файлы будут автоматические удалены.
1 |
# journalctl --vacuum-size=200M |
2.Удаление старых записей по времени (—vacuum-time)
Устанавливаем для логов срок хранения, по истечении которого они будут автоматически удалены
Удалить все логии старше последнего месяца
1 |
# journalctl --vacuum-time=1months |
Настройка ротации логов в конфигурационном файле
Настройки ротации логов можно также прописать в конфигурационном файле
1 |
/еtc/systemd/journald.conf |
который включает в числе прочих следующие параметры:
1 |
SystemMaxUse= |
максимальный объём, который логи могут занимать на диске;
1 |
SystemKeepFree= |
объём свободного места, которое должно оставаться на диске после сохранения логов;
1 |
SystemMaxFileSize= |
объём файла лога, по достижении которого он должен быть удален с диска;
1 |
RuntimeMaxUse= |
максимальный объём, который логи могут занимать в файловой системе /run;
1 |
RuntimeKeepFree= |
объём свободного места, которое должно оставаться в файловой системе /run после сохранения логов;
1 |
RuntimeMaxFileSize= |
объём файла лога, по достижении которого он должен быть удален из файловой системы /run.
1 |
# systemctl restart systemd-journald.service |
1 |
# systemctl status systemd-journald.service |
Централизованное хранение логов
Одной из самых распространённых задач в работе системного администратора является настройка сбора логов с нескольких машин с последующим помещением в централизованное хранилище.
В systemd предусмотрены специальные компоненты для решения этой задачи: systemd-journal-remote, systemd-journal-upload и systemd-journal-gatewayd.
С помощью команды systemd-journal-remote можно принимать логи с удалённых хостов и сохранять их (на каждом их этих хостов должен быть запущен демон systemd-journal-gatewayd), например:
1 |
# systemd-journal-remote −−url https://some.host:19531/ |
В результате выполнения приведённой команды логи с хоста some.host будут сохранены в директории var/log/journal/some.host/remote-some~host.journal.
С помощью команды systemd-journal-remote можно также складывать имеющиеся на локальной машине логи в отдельную директорию, например:
1 |
# journalctl -o export | systemd-journal-remote -o /tmp/dir - |
Команда systemd-journal-upload используется для загрузки логов с локальной машины в удалённое хранилище:
1 |
# systemd-journal-upload --url https://some.host:19531/ |
Источник:
https://habrahabr.ru/company/selectel/blog/264731/
https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs