Systemd регистрирует все сообщения Linux от ядра и системных процессов. Команда journalctl позволяет просматривать и редактировать журналы systemd, что делает ее мощным инструментом для отладки служб и процессов.
Что такое Systemd?
Systemd - это менеджер служб и систем Linux. Хотя пользователи не вызывают systemd напрямую, менеджер содержит множество инструментов и демонов для индивидуального запуска различных системных процессов.
Одной из самых мощных функциональных возможностей systemd являются функции протоколирования. Systemd предоставляет централизованное решение для протоколирования всех процессов ядра и пользователей через журналы, известные как журналы.
Демон journald собирает все сообщения, которые выводит система, а затем создает журналы, независимо от программы или процесса. Демон собирает данные со всех доступных системных ресурсов и сохраняет их в двоичном формате.
Синтаксис команды journalctl
Команда journalctl запрашивает и манипулирует данными журнала, собранными демоном journald. Этот инструмент жизненно важен для системных администраторов и дополняет другие инструменты ведения журналов Linux и программные решения для серверов Syslog.
Синтаксис команды следующий:
1 | journalctl <options> <matches> |
Без каких-либо параметров команда journalctl выводит все содержимое журнала, начиная с самой старой записи. Параметр <match> - это один или несколько разделенных пробелами аргументов для фильтрации полей вывода. Формат - "FIELD=VALUE".
Опции journalctl
В таблице ниже приведены общие параметры journalctl:
-a --all | Показать все поля полностью, включая непечатаемые символы. |
-f --follow | Показывает последние записи и постоянно печатает новые. |
--no-full | Усекает вывод. |
-e --pager-end | Переход к концу страницы. |
-n <количество> --lines=<количество> | Показывать последние записи, ограниченные <количеством> событий. Без аргумента по умолчанию - десять (10). |
-o <формат> --output=<формат> | Показывает записи журнала в запрошенном <формате>. |
--utc | Показывает время в формате всемирного координированного времени (UTC). |
-x --catalog | Добавляет поясняющий текст к сообщению журнала, где это возможно. |
-q --quiet | Подавляет информативные сообщения в выводе. |
-b [<ID> или <+-offset>] --boot[=<ID> или <+-offset>] | Показывает журналы с определенной загрузки. При отсутствии этого аргумента отображаются журналы текущей загрузки. |
-k --dmesg | Показывает только сообщения ядра. |
--list-boots | Показывает таблицу номеров загрузок и их идентификаторов. |
-g <regex> --grep=<regex> | Фильтрует вывод в соответствии с синтаксисом grep regex. |
-S <date>, -U <date> --since=<date>, --until=<date> | Показывает записи, более новые или более старые, чем указанная дата. |
-u <unit|шаблон> --unit=<unit|шаблон> | Показать журналы для указанного блока systemd или любого блока, совпадающего с <шаблоном>. |
--disk-usage | Рассчитывает и отображает общий размер журнала на диске. |
--vaccuum-size=<размер> | Ограничение размера архивного файла журнала до <размер>. |
--vaccuum-time=<время> | Ограничивает архивные журналы более новыми, чем <время>. |
--no-pager | Отключает пагинацию и отображает в виде стандартного вывода. |
Как читать systemd
В следующем разделе описано, как читать журналы systemd и использовать различные опции отображения для команды journalctl. Для каждой машины вывод будет разным, поскольку записи для каждой системы уникальны.
Показать все записи журнала
Чтобы показать все записи журнала, используйте команду journalctl без каких-либо опций:
1 | journalctl |
первая строка вывода показывает временной диапазон данных журнала. Столбцы содержат следующие данные в порядке слева направо:
- Дата и время.
- Хост.
- Источник журнала.
- Сообщение журнала.
Данные журнала содержат много записей. Для навигации используйте клавиши со стрелками (аналогично команде less).
Выйдите из журнала, нажав q.
Показать самые последние записи
Команда journalctl по умолчанию показывает самые старые записи. Чтобы перейти к концу пейджера и показать последние записи, используйте параметр -e:
1 | journalctl -e |
Для экономии места в выводе отображаются последние 1000 записей.
Чтобы контролировать количество строк в выводе, используйте опцию -n, за которой следует количество строк. Например, чтобы показать пять последних записей журнала, используйте:
1 | journalctl -n 5 |
Опция -e не нужна и подразумевается опцией -n. Если опустить число, по умолчанию отображаются десять последних записей.
Ограничение журналов конкретной загрузкой
Чтобы ограничить журналы текущей загрузкой, используйте тег -b без каких-либо параметров:
1 | journalctl -b |
Для перехода к определенной загрузке добавьте параметр смещения. Например, чтобы показать журналы предыдущих загрузок, выполните следующие действия:
1 | journalctl -b -1 |
В качестве альтернативы, покажите самый старый доступный журнал загрузки, используя:
1 | journalctl -b +1 |
Альтернативный способ увидеть конкретную загрузку - использовать идентификатор загрузки. Получите идентификаторы загрузки с помощью команды --list-boots:
1 | journalctl --list-boots |
В первом столбце отображается номер отрицательного смещения, а во втором - идентификатор загрузки. Скопируйте ID и добавьте его в качестве параметра к команде, например:
1 | journalctl -b cc07301f03874ec59312ece62504cfe8 |
Вывод ограничивает отображение журнала указанным экземпляром ID.
Отображение журналов в определенном временном окне
Отфильтруйте журнал, указав ограничение по времени. Для ограничения с указанного времени или до указанного времени есть две опции:
1 2 | journalctl -S <datetime> journalctl -U <datetime> |
Используйте эти опции по отдельности или комбинируйте их для создания временного окна.
Команда ожидает один из следующих форматов даты и времени:
Конкретная дата и время, например, 2022-08-30 09:20:00. Если опустить параметр времени, по умолчанию будет установлено значение 00:00:00.
Строки, например: "yesterday", "today", "2 hours ago", or "now"
Ниже приведен пример команды journalctl с определенным временным окном:
1 | journalctl -S 2022-08-02 -U 2022-08-12 |
Команда создает временное окно со 2 августа 2022 года по 12 августа 2022 года. В выводе будут показаны журналы, которые попадают в этот временной интервал.
В качестве альтернативы можно использовать строковый шаблон, например:
1 | journalctl -S "50 minutes ago" |
Вывод покажет журналы с указанного времени до текущего.
Отображение журналов по определенному блоку systemd
Отфильтруйте журналы по определенному блоку systemd, используя тег -u и указав имя блока. Например, чтобы отфильтровать только записи подразделения службы Jenkins, выполните следующее:
1 | journalctl -u nginx |
В выводе отобразятся записи журнала, относящиеся к конкретному блоку systemd (в данном случае nginx).
Чтобы отобразить все активные в данный момент подразделения systemd, используйте: systemctl list-units
Отображение сообщений ядра
Чтобы отобразить только сообщения журнала ядра, используйте параметр -k:
1 | journalctl -k |
В выводе будут показаны сообщения ядра только из текущей загрузки с применением тега -b. Чтобы найти журналы ядра из другой сессии загрузки, добавьте тег -b и выполните поиск по определенной загрузке.
Следить за журналами
Используйте тег -f или --follow для непрерывной печати последних журналов:
1 | journalctl -f |
Вывод печатает журналы по мере их создания в реальном времени. Опция позволяет отслеживать журналы с помощью journalctl по мере их добавления.
Чтобы выйти из программы просмотра, нажмите CTRL+C.
Фильтр сообщений журнала на основе приоритета
Отфильтруйте сообщения журнала по приоритету с помощью следующей команды:
1 | journalctl -p <число или текстовый приоритет> |
Существуют следующие приоритеты:
- Аварийная ситуация - 0 или emerg
- Тревога - 1 или alert
- Критический - 2 или crit
- Ошибка - 3 или err
- Предупреждение - 4 или warning
- Уведомление - 5 или notice
- Информировать - 6 или info
- Отладка - 7 или debug
Меньшее число указывает на сообщения с наивысшим приоритетом. Указание одноуровневого приоритета также показывает все журналы с более низким приоритетом (более критичные).
Например, чтобы отобразить предупреждения, используйте:
1 | journalctl -p 1 |
Или альтернативный вариант:
1 | journalctl -p alert |
В выводе будут отображаться только сообщения уровня предупреждения и более важные сообщения (если они есть).
Фильтр сообщений журнала на основе определенного пользователя
Чтобы просмотреть журналы для пользователя, получите идентификатор пользователя (UID) с помощью:
1 | id <user> |
Чтобы получить идентификатор текущего пользователя, опустите <user>. На выходе вы увидите значение UID для данного пользователя. Используйте поле журнала UID для фильтрации сообщений журнала на основе конкретного пользователя:
1 | journalctl _UID=<UID> |
Вывод фильтрует журнал журнала на основе указанного идентификатора пользователя.
Как редактировать вывод журнала systemd
Важным аспектом работы с журналами в качестве системного администратора является форматирование выводимых журналов. Systemd предлагает множество методов для манипулирования визуальным результатом и получения данных в нужном формате.
Вывод на стандартный выход
Команда journalctl отображает вывод с помощью пейджера. Отключите пейджер с помощью:
1 | journalctl --no-pager |
Полученный результат будет выведен в стандартный вывод (stdout). Используйте эту опцию при разборе данных журнала с помощью инструментов редактирования текста или сценариев Bash.
Усечение или расширение вывода
Пейджер journalctl показывает в выводе расширенные события журнала. Нажатие клавиш со стрелками вправо и влево помогает ориентироваться в тексте, который не помещается на экране.
Чтобы ограничить усечение вывода journalctl, используйте опцию --no-full:
1 | journalctl --no-full |
Вывод ограничивает строки до размера экрана, добавляя многоточие (...) для обозначения усеченного отображения.
Форматы вывода
Команда journalctl предлагает различные варианты форматов вывода. Синтаксис для формата вывода следующий:
1 | journalctl -o <формат вывода> |
Некоторые из доступных форматов включают:
- cat - Отображает только поле сообщения.
- export - Выводит двоичный формат, подходящий для резервного копирования.
- short - Генерирует вывод, похожий на классические файлы Syslog.
- short-precise - Отображает время с микросекундами.
- json - Форматирует записи журнала в однострочные JSON-записи.
- json-pretty - Форматирует в структуры JSON в несколько строк.
Например, для отображения в формате json-pretty используйте:
1 | journalctl -o json-pretty |
Различные форматы позволяют использовать данные журнала в базах данных, файлах сценариев или анализировать их с помощью программ мониторинга.
Обслуживание журналов
Хранение данных журнала требует затрат и занимает место. Ниже приведены некоторые советы и рекомендации по обнаружению использования диска, обслуживанию файлов журнальных данных и освобождению места, занимаемого старыми файлами журналов.
Отображение использования диска
Чтобы проверить использование диска журнала, выполните следующую команду:
1 | journalctl --disk-usage |
Вывод покажет общее пространство на диске, занятое архивными и активными журналами.
Удаление старых журналов
Удалите старые архивы журналов, установив желаемый предел размера. Команда требует sudo для удаления файлов /var/log/journal.
Например, установите размер в 1М с помощью:
1 | sudo journalctl --vacuum-size=1M |
Введите пароль sudo и нажмите Enter. В выводе будут выведены имена и размеры файлов, а последняя строка покажет объем освобожденной памяти.
В качестве альтернативы, удалите архивные журналы по времени. Все файлы старше установленного времени удаляются и освобождают память. Например, чтобы удалить файлы старше двух месяцев, выполните команду:
1 | sudo journalctl --vacuum-time=2months |
Суффиксы времени: s, m, h, days, months, weeks или years.
Ограничение журнала
Файл конфигурации журнала позволяет устанавливать ограничения и контролировать, сколько данных journald занимает на диске. Чтобы отредактировать этот файл, выполните команду:
1 | sudo nano /etc/systemd/journald.conf |
Файл содержит примеры полей конфигурации. Следующие параметры касаются размера журнала и ограничений памяти:
- SystemMaxUse - Максимальное постоянное хранилище, используемое журналом.
- SystemKeepFree - количество свободного места, которое журнал оставляет при добавлении записей в постоянное хранилище.
- SystemMaxFileSize - устанавливает максимальный размер файлов журнала в постоянном хранилище.
- RuntimeMaxUse - Максимальное дисковое пространство в постоянном хранилище.
- RuntimeKeepFree - Объем свободного пространства для других целей при записи в энергонезависимое хранилище.
- RuntimeMaxFileSize - Задает максимальный размер файлов журнала в энергонезависимом хранилище.
Контроль размера файла нацелен на достижение предельного размера архивных файлов. Раскомментируйте эти строки и установите ограничения, чтобы получить лучший контроль над хранилищем машины и потребления ресурсов.