В журнале у записи больше полей, чем видно в строке, и нужные выбирает jq.
Строка журнала показывает время, машину, программу с номером процесса и текст. Сама запись хранит десятки полей, и все их печатает journalctl -o json (в Вики) — по объекту JSON на запись, одной строкой. Вот поля, которые нужны чаще других:
| Поле | Что в нём |
|---|---|
MESSAGE |
текст записи |
PRIORITY |
уровень числом: 3 — err, 4 — warning, 6 — info |
_PID |
номер процесса |
_SYSTEMD_UNIT |
юнит службы, которая писала |
__REALTIME_TIMESTAMP |
время в микросекундах с 1970 года по UTC |
Строка python3[1076] называет программу: если на машине несколько служб на Python, по строке их не различить, а по полю _SYSTEMD_UNIT — можно. Выбирает поля jq: jq -r '._SYSTEMD_UNIT' печатает одно поле без кавычек, select(.PRIORITY == "3") оставляет записи с уровнем err. Значения полей в JSON журнала — строки, поэтому число 3 стоит в кавычках.
Что напечатает sudo journalctl -k -o json -n 1 | jq -r '._SYSTEMD_UNIT' — поле юнита у последней записи ядра?
-
journald только принимает и хранит запись. Юнит записи — служба, которая её написала, а запись ядра написало ядро.
-
Отсутствующее поле jq ошибкой не считает: для него это значение null, его он и печатает.
-
Слово kernel стоит в поле
_TRANSPORT, а поля_SYSTEMD_UNITу записи ядра нет: её прислала не служба.
У записи ядра нет поля _SYSTEMD_UNIT — его ставит journald записям служб, — и jq печатает null. Поэтому ошибки ядра при подсчёте по юнитам собираются под null.
Полями удобно считать: jq -r печатает поле каждой записи отдельной строкой, а uniq -c сворачивает одинаковые строки в одну с числом впереди — например, сколько записей с ошибками оставила за день каждая служба машины. uniq сворачивает только соседние строки, поэтому перед ним ставят sort, а sort -rn после него поднимает наверх самое большое число. Записи ядра при таком счёте соберутся под null.
Найди самую шумную службу
На машине несколько служб на Python, и все пишут в журнал под именем python3. Узнай, какая служба записала больше всего записей с уровнем err и серьёзнее, и запиши имя её юнита в ~/noisy.txt.
Цели · 0 из 1
- Записать в ~/noisy.txt юнит службы с наибольшим числом ошибок ещё не выполнена