Поиск по сайту:

Как использовать journalctl для чтения системных журналов Linux


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

Централизованное ведение журнала

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

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

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

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

journalctl без излишеств

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

journalctl

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

Нажатие клавиши End переместит вас прямо в конец списка и самые новые записи журнала.

Нажмите Ctrl+C, чтобы выйти.

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

sudo journalctl

Если вам нужно, вы можете заставить journalctl отправлять свой вывод в окно терминала, а не в less, используя --no-pager вариант.

sudo journalctl --no-pager

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

Чтобы ограничить количество строк, возвращаемых journalctl, используйте параметр -n (строки). Давайте запросим десять строк вывода:

sudo journalctl -n 10

После обновления журнала

Чтобы journalctl отображал самые новые записи по мере их поступления в журнал, используйте параметр -f (follow).

sudo journalctl -f

Самая новая запись имеет отметку времени 07:09:07. По мере того, как происходит новое действие, новые записи добавляются к нижней части дисплея. Обновления практически в реальном времени — круто!

В 07:09:59 приложение под названием geek-app добавило в журнал запись с надписью «Новое сообщение от HTG».

Изменение формата отображения

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

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

sudo journalctl -n 10 -o short-full

Слева направо поля:

  • Время создания сообщения по местному времени.
  • Имя хоста.
  • Имя процесса. Это процесс, создавший сообщение.
  • Сообщение журнала.

Чтобы получить полную отметку даты и времени, используйте модификатор short-full:

sudo journalctl -n 10 -o short-full

Форматы даты и времени в этом выводе — это формат, в котором вам нужно указать дату и время, когда вы выбираете сообщения журнала по периоду, как мы вскоре увидим.

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

sudo journalctl -n 10 -o verbose

Существует много возможных полей, но редко все поля присутствуют в сообщении.

Одно поле, о котором стоит поговорить, — это поле Priority. В этом примере он имеет значение 6. Значение представляет важность сообщения:

  • 0: чрезвычайная ситуация. Система непригодна для использования.
  • 1: оповещение. Было отмечено условие, которое необходимо исправить немедленно.
  • 2: критический. Сюда относятся сбои, дампы ядра и серьезные сбои в основных приложениях.
  • 3: ошибка. Сообщается об ошибке, но она не считается серьезной.
  • 4: предупреждение. Обращает ваше внимание на условие, которое, если его игнорировать, может стать ошибкой.
  • 5: обратите внимание. Используется для сообщения о необычных событиях, но не об ошибках.
  • 6: Информация. Регулярные оперативные сообщения. Они не требуют действий.
  • 7: Отладка. Сообщения помещаются в приложения, чтобы упростить их отладку.

Если вы хотите, чтобы выходные данные были представлены в виде правильно сформированных объектов 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-91-12 07:00:00"

Дисплей содержит только сообщения, пришедшие после даты и времени в команде.

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

sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"

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

Использование относительных периодов времени

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

sudo journalctl -S -1d

Сообщения журнала перечислены с 00:00:00 вчерашнего дня до «сейчас».

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

sudo journalctl -S -1h

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

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

sudo journalctl -S yesterday

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

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

sudo journalctl -S today

Отображается все с 00:00:00 до момента подачи команды.

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

sudo journalctl -S -2d -U today

Все, начиная с позавчера и до сегодняшнего дня, извлекается и отображается.

Выбор сообщений журнала по полям данных

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

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

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

sudo journalctl -f _COMM=geek-app

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

sudo journalctl _PID=751

На машине, используемой для исследования этой статьи, демон SSH — это процесс 751.

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

sudo journalctl _UID=1000

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

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

sudo journalctl /usr/bin/anacron

Все сообщения журнала планировщика anacron извлекаются и отображаются.

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

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

journalctl -F _UID

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

journalctl -F _GID

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

Список сообщений ядра

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

sudo journalctl -k

Выделение отражает важность сообщения в соответствии со значениями в поле Priority.

Просмотр загрузочных сообщений

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

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

journalctl -b

Записи журнала для последней загрузки показаны для вас.

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

journalctl -b 3

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

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

journalctl --list-boots

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

sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

Сообщения журнала из запрошенной нами последовательности загрузки извлекаются и отображаются.

Управление пространством на жестком диске журнала

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

journalctl --disk-usage

С сегодняшними жесткими дисками 152 МБ — это совсем немного, но в демонстрационных целях мы все же урежем его. Мы можем сделать это двумя способами. Во-первых, установить предельный размер журнала, до которого вы хотите уменьшить его. Конечно, он снова вырастет, но теперь мы можем обрезать его, чтобы он был готов к этому новому росту.

Мы воспользуемся замечательно названной опцией --vacuum-size и укажем размер, до которого мы хотим уменьшить журнал. Мы попросим 100 МБ. Мы можем представить это так: мы просим journalctl «выбросить все, что можно, но не опускаться ниже 100 МБ».

journalctl --vacuum-size=100M

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

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

journalctl --vacuum-time=1weeks

Данные против информации

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

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

RELATED: Best Linux Laptops for Developers and Enthusiasts