Journalctl

Централизованное ведение журнала Система systemd и менеджер служб внесли значительные изменения в способ сбора системных журналов. Журналы раньше располагались в разных местах файловой системы в соответствии с сервисом или демоном, который их создавал. Но у них всех было одно общее. Это были простые текстовые файлы.

С помощью systemd все файлы журналов системны, загрузки и ядра собираются и управляются центральным специализированным решением для ведения журнала. Формат, в котором они хранятся, является двоичным. Как мы убедимся далее, это облегчает возможность извлечения данных в разные форматы, такие как JSON.

Это также может упростить перекрёстную ссылку на связанную информацию, которая ранее была бы записана в отдельных файлах журнала. Поскольку данные теперь хранятся в одном журнале, данные из нескольких источников, представляющих интерес, могут быть выбраны и отображены в одном переплетённом списке записей.

journalctl — это инструмент, используемый для работы с журналом.

journalctl без излишеств Вы можете вызвать journalctl без параметров командной строки:

journalctl Команда journalctl отобразит весь журнал, с самыми старыми записями вверху списка. Список отображается с использованием команды less, что позволяет просматривать страницы и осуществлять поиск с использованием обычных функций навигации команды less. Вы также можете использовать клавиши «Стрелка влево» и «Стрелка вправо» для боковой прокрутки и чтения широких записей журнала.

Нажатие клавишу End для перехода к нижней части списка, чтобы увидеть самые новые записи в журнале.

Для выхода нажмите клавишу q или Ctrl+c.

journalctl можно запустить без использования sudo, но если использовать sudo, то вы гарантированно увидите все подробности в журнале.

sudo journalctl

Если вы хотите, чтобы все данные были просто выведены в окно терминала без использования программы less, то запустите journalctl с опцией –no-pager:

sudo journalctl --no-pager

Будет выведено много информации, вы окажитесь в конце журнала и вам будет доступно приглашении командной строки.

Чтобы ограничить количество строк, которые возвращает journalctl, используйте опцию -n ЧИСЛО. Допустим, нужно вывести только десять строк:

sudo journalctl -n 10

Постоянное обновление выводимой информации Вы можете сделать так, что journalctl будет постоянно выводить новые записи журнала в реальном времени по мере их появления. Для этого используйте опцию -f.

sudo journalctl -f

Обновление происходит практически в реальном времени, в зависимости от количества событий, выводимых записей может быть много.

Изменение формата отображения Поскольку журнал представляет собой двоичный файл, данные в нем должны быть переведены или разобраны в текст, прежде чем он может быть отображён для вас. При использовании разных парсеров разные форматы вывода могут быть созданы из одних и тех же двоичных исходных данных. Journalctl может использовать несколько разных форматов.

По умолчанию выводится короткий формат, который очень похож на классический формат системного журнала. Чтобы явно запросить короткий формат, используйте опцию -o с модификатором short:

sudo journalctl -n 10 -o short

Поля слево-направо:

Время создания сообщения по местному времени. Имя хоста. Название процесса. Это процесс, который сгенерировал сообщение. Сообщение для записи. Чтобы получить полную дату и время, используйте модификатор short-full:

sudo journalctl -n 10 -o short-full

Обратите на формат даты и времени в этих выходных данных — чуть позже мы будем использовать эти форматы при выводе сообщений журнала по периодам.

Чтобы увидеть все метаданные, которые сопровождают каждое сообщение журнала, используйте модификатор для увеличения подробности.

sudo journalctl -n 10 -o verbose

В выводимой информации много различных полей, но обычно в одном сообщении они представлены не все.

Одно из полей, которое следует обсудить особо, это поле Priority. Значение поля указывает на важность сообщения. Могут быть следующие варианты:

0: Emergency (чрезвычайная ситуация). Систему невозможно использовать.

1: Alert (тревога). Было помечено условие, которое должно быть немедленно исправлено.

2: Critical (критическая ситуация). Это охватывает сбои и существенные нарушения работы в главных приложениях.

3: Error (ошибка). Было сообщено об ошибке, но она не рассматривается как тяжёлая.

4: Warning (предупреждение). Обращает ваше внимание на условие, которое, если его игнорировать, может стать ошибкой.

5: Notice (уведомление). Используется для сообщения о необычных событиях, но не об ошибках.

6: Information (информация). Регулярные оперативные сообщения. Это не требует действий.

7: Debug (отладочная информация). Сообщения помещаются в приложения, чтобы облегчить их отладку.

Если вы хотите, чтобы вывод был представлен как правильно сформированные объекты JavaScript Object Notation (JSON), используйте модификатор json:

sudo journalctl -n 10 -o json

Каждое сообщение должным образом упаковывается как правильно сформированный объект JSON и отображает одно сообщение на строку вывода.

Чтобы вывод JSON был напечатан в удобном для восприятия человеком виде, используйте модификатор json-pretty.

sudo journalctl -n 10 -o json-pretty

Каждый объект JSON разбит на несколько строк, каждая пара имя-значение находится на новой строке.

Чтобы видеть только сообщения записей журнала без меток времени или других метаданных, используйте модификатор cat:

sudo journalctl -n 10 -o cat

Этот формат отображения может затруднить определение того, какой процесс вызвал событие журнала, хотя некоторые сообщения содержат подсказку.

Выбор сообщений журнала по периоду времени Чтобы ограничить вывод из journalctl интересующим вас периодом времени, используйте опции -S (с) и -U (до).

Чтобы просмотреть записи журнала с определённого времени и даты, используйте эту команду:

sudo journalctl -S "2020-02-13 07:00:00"

Вывод содержит только те сообщения, которые поступили после указанных в команде даты и времени.

Чтобы установить период времени, из которого вы хотите получить данные, используйте вместе опции -S (с) и -U (до). Эта команда просматривает сообщения журнала за 15 минут.

sudo journalctl -S "2020-02-13 07:00:00" -U "2020-02-13 07:15:00"

Это отличная комбинация, если вы знаете, что в вашей системе произошло что-то странное, и примерно когда это произошло.

Использование относительных периодов времени Вы можете использовать относительную адресацию при выборе периода времени. Это означает, что вы можете дать указание вроде таких, как «показать мне все события за один день до настоящего момента». Это именно то, что означает следующая команда. В ней «d» означает «день», а «-1» означает один день в прошлом.

sudo journalctl -S -1d

Будут выведены сообщения журнала с 00:00:00 вчера до «сейчас».

Если вы хотите исследовать что-то, что произошло в недавнем прошлом, вы можете указать относительный период времени, измеряемый в часах. Здесь мы просматриваем сообщения журнала за последний час:

sudo journalctl -S -1h

Отобразятся сообщения за последний час. Вы также можете использовать «m» для установки относительных периодов времени, измеряемых в минутах, и «w» для недель.

journalctl понимает today (сегодня), yesterday (вчера) и tomorrow (завтра). Эти модификаторы предоставляют удобный способ задания общих периодов времени. Чтобы увидеть все события, которые произошли вчера, используйте эту команду:

sudo journalctl -S yesterday

Все события журнала журнала, которые произошли вчера, до полуночи 00:00:00, извлекаются и отображаются для вас.

Чтобы увидеть все сообщения журнала, полученные сегодня, используйте эту команду:

sudo journalctl -S today

Отобразится всё с 00:00:00 до момента ввода команды.

Вы можете смешивать различные модификаторы периода времени. Чтобы увидеть все от двух дней назад до сегодняшнего дня, используйте эту команду:

1 sudo journalctl -S -2d -U today Эта команда покажет все сообщения системного журнала с позавчера до сегодняшнего дня (не включая сегодня).

Выбор сообщений журнала по полям данных Вы можете искать сообщения журнала, которые соответствуют широкому диапазону полей, присутствующих в записях логов. Эти фильтры пытаются найти совпадения в метаданных, прикреплённых к каждому сообщению. Рекомендуется обратиться к списку полей и выбрать те, которые будут наиболее полезными для вас:

man systemd.journal-fields

Имейте в виду, заполняет ли приложение каждое поле или нет, полностью зависит от авторов приложения. Вы не можете быть уверенным, что каждое поле будет заполнено.

Все модификаторы полей журнала используются одинаково. Мы будем использовать несколько в наших примерах ниже. Чтобы найти сообщения журнала из определённого приложения, используйте модификатор _COMM (команда). Если вы также используете опцию -f (рассмотрена ранее, означает обновлять данные в реальном времени), journalctl будет отслеживать новые сообщения из этого приложения по мере их поступления.

sudo journalctl -f _COMM=NetworkManager

Вы можете искать записи журнала, используя идентификатор процесса, который сгенерировал сообщение журнала. Используйте команду ps, чтобы найти идентификатор процесса для демона или приложения, которое вы собираетесь искать.

sudo journalctl _PID=409200

Обратите внимание, что после остановки и повторного запуска процесса, а также после перезагрузки, идентификаторы меняются!

Вы также можете искать по идентификатору пользователя. Это идентификатор пользователя, который запустил приложение или команду или владеет процессом.

sudo journalctl _UID=1000

В результате будут выведены все сообщения журнала, отфильтрованные по ID пользователя. Показаны будут только записи, связанные с пользователем 1000:

Другой способ поиска сообщений журнала, относящихся к конкретному приложению, - указать путь к исполняемому файлу.

sudo journalctl /usr/bin/crond

Будут выведены все сообщения службы crond, которая отвечает за запуск программ в определённые интервалы времени.

Чтобы упростить поиск, мы можем попросить journalctl перечислить все значения, которые он содержит, для любого из полей журнала.

Чтобы увидеть идентификаторы пользователей, для которых journalctl записал сообщения журнала, используйте опцию -F (поля) и передайте идентификатор поля _UID.

journalctl -F _UID

Давайте сделаем это снова и посмотрим на идентификаторы групп (_GID):

journalctl -F _GID

Вы можете сделать это с любым из идентификаторов полей журнала.

man systemd.journal-fields

Вывод сообщений ядра Существует встроенный способ быстрой изоляции сообщений ядра. Вам не нужно искать и изолировать их самостоятельно. Опция -k удаляет все остальные сообщения и даёт вам мгновенный просмотр записей журнала ядра.

sudo journalctl -k

Подсветка отражает важность сообщения в соответствии со значениями в поле «Priority».

Просмотр загрузочных сообщений Если у вас возникла проблема, связанная с загрузкой, которую вы хотите расследовать, journalctl вам поможет. Возможно, вы добавили новое оборудование, и оно не отвечает, или ранее работающий аппаратный компонент больше не работает после вашего последнего обновления системы.

Чтобы просмотреть записи журнала, относящиеся к вашей последней загрузке, используйте опцию -b:

journalctl -b

Показаны записи из логов последней загрузки:

Когда мы говорим «последняя загрузка», мы имеем в виду процесс загрузки, который оживил ваш компьютер для текущего сеанса входа в систему. Чтобы увидеть предыдущие загрузки, вы можете использовать число, чтобы указать journalctl, какая загрузка вам интересна. Чтобы увидеть третью предыдущую загрузку, используйте эту команду:

journalctl -b 3

Как правило, если у вас возникла проблема и вам пришлось перезагрузить компьютер, вам интересна предыдущая последовательность загрузки. Так что это популярная форма команды.

Легко запутаться в последовательности загрузок. Чтобы помочь, мы можем попросить journalctl перечислить загрузки, которые он записал в своём журнале, для этого используйте опцию –list-boots.

journalctl --list-boots

Вы можете указать загрузку, для которой вы хотите видеть записи, для этого выберите интересующие вас метки времени и даты, а затем используйте номер в левом столбце для получения записей логов для этой загрузки. Вы также можете скопировать 32-битный идентификатор загрузки и использовать его с journalctl.

sudo journalctl -b bd7cf5063b15440eb5920851af7a5879

Будут извлечены и показаны только сообщения для этой загрузки.

Поиск проблем служб (journalctl -xe) В случае, если запуск службы завершился ошибкой, то вам будет рекомендовано запустить команду вида:

systemctl status ИМЯ-СЛУЖБЫ

или команду:

journalctl -xe

Первая команда показывает статус указанной службы и, среди прочего, может содержать указание на ошибку — неверный синтаксис в конфигурационном файле, последние диагностические сообщение и прочее.

Что касается команды journalctl с опциями -xe, то рассмотрим эти опции более подробно — фактически, это две опции -x и -e.

Элемент ненумерованного списка-x, –catalog дополняет строки журнала пояснительными текстами из каталога сообщений. Это добавит пояснительные тексты справки к сообщениям журнала в выходных данных, где это возможно. Эти короткие справочные тексты объяснят контекст ошибки или события журнала, возможные решения, а также указатели на форумы поддержки, документацию для разработчиков и любые другие соответствующие руководства. Обратите внимание, что справочные тексты доступны не для всех сообщений, а только для выбранных.

-e, –pager-end говорит немедленно перейте к концу журнала внутри подразумеваемого инструмента пейджера. Это подразумевает -n1000, чтобы гарантировать, что пейджер не будет буферизовать журналы неограниченного размера. Это может быть заменено явным параметром -n с другим числовым значением, в то время как -nall отключит это ограничение. Обратите внимание, что эта опция поддерживается только для пейджера less(1).

То есть команда с этими опциями необязательно покажет то, что вы ожидаете, она может вывести ошибки и сообщения других служб. Поэтому если вы хотите использовать её для более точного получения информации, можете указать путь до интересующей вас программы, например:

journalctl -xe /usr/bin/openvpn

Вы также можете использовать любые другие уже рассмотренные опции, например, номер загрузки:

journalctl -b 2 -xe /usr/bin/openvpn

Очистка места на диске: управление пространством на жёстком диске для системного журнала Конечно, журнал и все его сообщения журнала хранятся на вашем жёстком диске. Это означает, что они будут занимать место на жёстком диске. Чтобы узнать, сколько места занял журнал, используйте параметр –disk-using.

journalctl --disk-usage

С сегодняшними жёсткими дисками 2.3 ГБ это не так уж много места, но в демонстрационных целях мы все равно очистим место на диске. Есть два способа сделать это. Первый — установить ограничение размера, до которого вы хотите уменьшить журнал. Конечно, он снова вырастет, но процедуру можно будет повторить снова.

Мы будем использовать замечательную опцию –vacuum-size и передадим размер, до которого мы хотели бы уменьшить занимаемое место. Мы укажем 100 МБ. Это означает, мы просим journalctl очистить все данные логов, которые занимают больше 100 МБ в системном журнале.

journalctl --vacuum-size=100M

Другой способ сократить размер журнала — использовать опцию –vacuum-time. Эта опция сообщает journalctl об отмене сообщений, которые старше, чем период, указанный в командной строке. Вы можете использовать дни, недели, месяцы и годы в качестве периодов времени.

Давайте отсеем все сообщения старше одной недели:

journalctl --vacuum-time=1weeks

Данные против информации Данные бесполезны до тех пор, пока вы не можете получить и использовать их. В случае использования, они становятся полезной информацией. Команда journalctl является очень гибким и сложным инструментом, который позволяет вам получить интересующую информацию различными способами.

Вы можете использовать практически любой фрагмент информации, которая вам нужна, в нужных вам сообщениях журнала.