Разбираемся с journalctl: Ваше руководство по системным журналам Linux
Изучите команды journalctl для просмотра, фильтрации, отслеживания и очистки журналов systemd в Linux.
Разбираемся с journalctl: Ваше руководство по системным журналам Linux
Утилита journalctl является основной командой для просмотра журналов, собираемых systemd-journald. Когда служба выходит из строя, загрузка зависает или сообщение ядра прокручивается слишком быстро, обычно именно в journalctl вы найдете подробности.
В отличие от обычных текстовых файлов журналов в /var/log, журнал хранит структурированные записи с метаданными, такими как имя модуля, приоритет, идентификатор загрузки и временная метка. Это позволяет точно фильтровать журналы, вместо того чтобы открывать несколько файлов и гадать.
Понимание журнала systemd
Прежде чем углубляться в команды, полезно понять, чем управляет journalctl. Журнал systemd собирает журналы от ядра, служб (модулей), приложений и даже процесса запуска системы. Эти журналы обычно хранятся в структурированных двоичных файлах, что делает их поиск и фильтрацию гораздо быстрее, чем традиционные плоские файлы.
Ключевые концепции:
- Постоянство: Журналы могут быть настроены на постоянное хранение между перезагрузками (постоянный режим) или только в памяти (энергозависимый режим).
- Структурированные данные: Журналы содержат метаданные (например, имя модуля, приоритет, идентификатор загрузки), которые
journalctlиспользует для фильтрации.
Основные команды просмотра
Самая распространенная потребность — просто просмотреть журналы. Вот основные команды для начала изучения истории вашей системы.
1. Просмотр всех журналов
Чтобы увидеть каждую запись, собранную журналом с момента начала записи, используйте команду без аргументов:
journalctl
По умолчанию этот вывод разбивается на страницы с помощью такого инструмента, как less, что позволяет перемещаться вверх и вниз с помощью клавиш со стрелками или пробела.
2. Просмотр журналов в реальном времени (отслеживание)
Подобно использованию tail -f, вы можете отслеживать журналы по мере их записи в журнал. Это бесценно при запуске или отладке конкретной службы:
journalctl -f
Чтобы выйти из режима реального времени, нажмите Ctrl+C.
3. Ограничение вывода по количеству строк
Если вам нужны только самые последние записи, используйте флаг -n, чтобы указать количество строк:
# Показать последние 20 записей журнала
journalctl -n 20
4. Просмотр журналов с определенного времени
Фильтрация по времени — одна из самых сильных сторон journalctl. Вы можете использовать относительные или абсолютные временные метки.
Примеры относительного времени:
| Команда | Описание |
|---|---|
journalctl --since "1 hour ago" |
Журналы за последний час. |
journalctl --since "yesterday" |
Журналы с начала предыдущего календарного дня. |
journalctl --since "2023-10-26 14:30:00" |
Журналы после определенной даты и времени. |
Совет: Вы можете комбинировать --since и --until, чтобы указать точный диапазон, например: journalctl --since "2023-10-26" --until "2023-10-27 00:00:00".
Фильтрация журналов по модулю, службе или процессу
Одно из наиболее важных применений journalctl — изоляция сообщений, связанных с конкретным модулем systemd (службой).
Фильтрация по имени службы
Используйте флаг -u (или --unit), за которым следует имя службы (например, sshd.service, nginx.service):
# Просмотр журналов только для службы веб-сервера Apache
journalctl -u apache2.service
# Отслеживание журналов для службы Docker
journalctl -u docker.service -f
Фильтрация по идентификатору загрузки
Systemd отслеживает журналы между различными загрузками системы. Чтобы увидеть журналы с предыдущего запуска, сначала выведите список доступных загрузок:
journalctl --list-boots
Это выводит индексированный список (например, -1, -2, 0 для текущей загрузки). Затем вы можете использовать индекс или полный идентификатор загрузки:
# Показать журналы с непосредственно предшествующей загрузки
journalctl -b -1
# Показать журналы с определенным идентификатором загрузки (используйте длинный идентификатор, указанный выше)
journalctl -b a1b2c3d4e5f6...
Фильтрация по сообщениям ядра
Чтобы просмотреть только сообщения, исходящие от ядра (аналогично использованию dmesg):
journalctl -k
# Или, что эквивалентно:
journalctl -b -k
Расширенная фильтрация и управление выводом
Эффективное устранение неполадок часто требует комбинирования фильтров и управления форматом вывода.
1. Фильтрация по уровню приоритета
Журналам присваиваются уровни приоритета от 0 (emerg) до 7 (debug). Вы можете использовать флаг -p или --priority для просмотра сообщений выбранного уровня серьезности и более серьезных уровней:
| Уровень приоритета | Числовое значение |
|---|---|
err или error |
3 |
warning |
4 |
notice |
5 |
info |
6 |
# Показать все ошибки, критические и аварийные сообщения от службы SSH
journalctl -u sshd.service -p err
2. Поиск определенного текста
Когда стандартной фильтрации недостаточно, вы можете передать вывод в grep или использовать --grep в системах, версия journalctl которых поддерживает это:
# Поиск во всех журналах строк, содержащих слово 'failed'
journalctl | grep failed
# Или используйте опцию --grep для более простой фильтрации (если доступно/предпочтительно)
journalctl --grep=failed
3. Изменение формата вывода
Для написания скриптов или перемещения журналов в другие инструменты важно изменить формат вывода. По умолчанию используется pretty (читаемый человеком).
--output=json: Выводит записи в виде структурированных объектов JSON.--output=short: Похож на pretty, но менее красочный.--output=export: Выводит необработанные записи журнала для архивирования.
# Вывод последних журналов в формате JSON
journalctl -n 5 --output=json
4. Комбинирование фильтров
Фильтры накладываются мультипликативно. Чтобы увидеть все ошибки Nginx, записанные за последние 10 минут:
journalctl -u nginx.service --since "10 minutes ago" -p err
Управление размером журнала и постоянством
Со временем журнал может занимать значительное дисковое пространство, особенно если он настроен на постоянное ведение журнала. Системные администраторы должны управлять его размером.
Проверка текущего использования
Чтобы узнать, сколько дискового пространства занимают текущие файлы журнала:
journalctl --disk-usage
Очистка старых журналов
Вы можете очищать журналы на основе времени или общего размера.
Очистка по времени:
# Сохранять только журналы за последние 7 дней
journalctl --vacuum-time=7d
Очистка по размеру:
# Уменьшить общий размер журнала до максимум 500 мегабайт
journalctl --vacuum-size=500M
Предупреждение: Будьте осторожны при удалении журналов, особенно со старых загрузок (
-b). Убедитесь, что важная диагностическая информация не удалена преждевременно.
Вывод
Для повседневного устранения неполадок начните с journalctl -u <служба> -n 50 --no-pager, добавьте -f, когда вам нужен вывод в реальном времени, и используйте --since или -b, когда проблема привязана к временному окну или загрузке. Перед удалением журналов проверьте journalctl --disk-usage и храните достаточно истории для отката и анализа инцидентов.