Як використовувати journalctl для читання системних журналів Linux

З появою systemd, система ведення журналів у Linux зазнала значних змін. У цій статті ми розглянемо, як використовувати команду `journalctl` для перегляду та фільтрації повідомлень системного журналу.

Централізоване зберігання журналів

Менеджер systemd, незважаючи на суперечки, кардинально змінив спосіб збору системних журналів. Раніше журнали зберігалися у різних місцях файлової системи, залежно від служби або демона, що їх генерував. Спільним для них було те, що вони були звичайними текстовими файлами.

Завдяки systemd, усі системні журнали, журнали завантаження та ядра збираються та керуються єдиною централізованою системою. Зберігаються вони у бінарному форматі, що спрощує видобування даних у різних форматах, наприклад, JSON, як ми побачимо далі.

Такий підхід також полегшує перехресні посилання на пов’язану інформацію, яка раніше була б розкидана по різних файлах журналів. Оскільки всі дані тепер зберігаються в одному місці, можна вибирати та відображати записи з різних джерел в одному переплетеному списку.

`journalctl` – це інструмент, який використовується для роботи з журналом.

Основи використання journalctl

Запуск `journalctl` без будь-яких параметрів:

journalctl

Команда показує весь журнал, починаючи з найстаріших записів. Використовуючи `less`, можна переглядати журнал посторінково та здійснювати пошук. Стрілками вліво і вправо можна прокручувати довгі записи.

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

Для виходу натисніть Ctrl+C.

Хоча `journalctl` можна викликати без `sudo`, ви отримаєте доступ до всієї інформації у журналі, якщо будете використовувати `sudo`.

sudo journalctl

Якщо потрібно, щоб `journalctl` виводив дані безпосередньо в термінал, а не через `less`, використайте параметр `–no-pager`.

sudo journalctl --no-pager

Виведення швидко прокручується у вікні термінала.

Щоб обмежити кількість рядків виведення, скористайтеся параметром `-n` (рядки). Наприклад, щоб отримати 10 останніх рядків:

sudo journalctl -n 10

Стеження за оновленнями журналу

Щоб `journalctl` відображав найновіші записи в міру їх надходження, використовуйте параметр `-f` (follow).

sudo journalctl -f

Нові записи додаються в нижній частині екрана в майже реальному часі.

Наприклад, програма `geek-app` додала запис “Нове повідомлення від HTG” о 07:09:59.

Зміна формату виведення

Оскільки журнал зберігається у бінарному форматі, дані потрібно перетворити або проаналізувати в текст для відображення. За допомогою різних синтаксичних аналізаторів можна створити різні формати виведення з одних і тих самих бінарних даних. `journalctl` підтримує кілька різних форматів.

Формат виведення за замовчуванням – це короткий формат, схожий на класичний формат системного журналу. Щоб явно вказати короткий формат, використайте параметр `-o` (output) з модифікатором `short`.

sudo journalctl -n 10 -o short

Зліва направо відображаються:

  • Час створення повідомлення за місцевим часом.
  • Ім’я хоста.
  • Назва процесу, який створив повідомлення.
  • Повідомлення журналу.

Для отримання повних відміток дати і часу, використовуйте модифікатор `short-full`:

sudo journalctl -n 10 -o short-full

Формат дати та часу в цьому виведенні – це формат, який потрібно використовувати для вибору повідомлень журналу за періодом часу, як ми побачимо пізніше.

Щоб переглянути всі метадані, що супроводжують кожне повідомлення журналу, використовуйте модифікатор `verbose`.

sudo journalctl -n 10 -o verbose

Існує багато можливих полів, але не всі вони присутні у кожному повідомленні.

Одним з важливих полів є “Пріоритет”. У цьому прикладі його значення – 6. Це значення відображає важливість повідомлення:

  • 0: Надзвичайна ситуація. Система непридатна для використання.
  • 1: Сповіщення. Потрібно термінове виправлення.
  • 2: Критично. Включає збої, coredump та серйозні збої основних програм.
  • 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` розуміє `today`, `yesterday` і `tomorrow`. Щоб побачити всі події за вчора, виконайте цю команду:

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` (kernel) видаляє всі інші повідомлення, залишаючи тільки записи журналу ядра.

sudo journalctl -k

Підсвічування відображає важливість повідомлення відповідно до значень у полі “Пріоритет”.

Перегляд повідомлень завантаження

Якщо у вас є проблема, пов’язана із завантаженням, `journalctl` може допомогти. Наприклад, якщо ви додали нове обладнання, яке не працює, або компонент перестав працювати після оновлення системи.

Щоб переглянути записи журналу, пов’язані з останнім завантаженням, використовуйте параметр `-b` (boot):

journalctl -b

Відображаються записи журналу для останнього завантаження.

Під “останнім завантаженням” мається на увазі процес завантаження, який запустив ваш комп’ютер під час поточного сеансу. Щоб переглянути попередні завантаження, можна вказати число. Наприклад, для перегляду третього попереднього завантаження:

journalctl -b 3

Зазвичай, після проблем із системою та перезавантаженням, вас цікавить саме попереднє завантаження.

Послідовність завантажень іноді легко сплутати. Щоб допомогти, можна попросити `journalctl` перерахувати завантаження, які є в журналі, за допомогою параметра `–list-boots`.

journalctl --list-boots

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

sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

<img src=”https://techukraine.net/