# Шпаргалка по journalctl в Linux В Linux работающем под управлением системы инициализации systemd для просмотра логов определенного сервиса или загрузки системы необходимо использовать утилиту **journalctl** Наличие этой утилиты в системе не означает, что теперь нет возможности пользоваться обычными файлами логов. Большинство сервисов как и раньше пишут свои основные логи в файлы, а в лог journalctl пишутся сообщения при старте сервисов, а также различные системные сообщения. ## Синтаксис и опции journalctl Синтаксис: ``` journalctl опции ``` основные опции: * **--full, -l** - отображать все доступные поля; * **--all, -a** - отображать все поля в выводе full, даже если они содержат непечатаемые символы или слишком длинные; * **--pager-end, -e** - отобразить только последние сообщения из журнала; * **--lines, -n** - количество строк, которые нужно отображать на одном экране, по умолчанию 10; * **--no-tail** - отображать все строки доступные строки; * **--reverse, -r** - отображать новые события в начале списка; * **--output, -o** - настраивает формат вывода лога; * **--output-fields** - поля, которые нужно выводить; * **--catalog, -x** - добавить к информации об ошибках пояснения, ссылки на документацию или форумы там, где это возможно; * **--quiet, -q** - не показывать все информационные сообщения; * **--merge, -m** - показывать сообщения из всех доступных журналов; * **--boot, -b** - показать сообщения с момента определенной загрузки системы. По умолчанию используется последняя загрузка; * **--list-boots** - показать список сохраненных загрузок системы; * **--dmesg, -k** - показывает сообщения только от ядра. Аналог вызова команды dmesg; * **--identifier, -t** - показать сообщения с выбранным идентификатором; * **--unit, -u** - показать сообщения от выбранного сервиса; * **--user-unit** - фильтровать сообщения от выбранной сессии; * **--priority, -p** - фильтровать сообщения по их приоритету. Есть восемь уровней приоритета, от 0 до 7; * **--grep, -g** - фильтрация по тексту сообщения; * **--cursor, -c** - начать просмотр сообщений с указанного места; * **--since, -S, --until, -U** - фильтрация по дате и времени; * **--field, -F** - вывести все данные из выбранного поля; * **--fields, -N** - вывести все доступные поля; * **--system** - выводить только системные сообщения; * **--user** - выводить только сообщения пользователя; * **--machine, -M** - выводить сообщения от определенного контейнера; * **--header** - выводить заголовки полей при выводе журнала; * **--disk-usage** - вывести общий размер лог файлов на диске; * **--list-catalog** - вывести все доступные подсказки для ошибок; * **--sync** - синхронизировать все не сохраненные журналы с файловой системой; * **--flush** - перенести все данные из каталога /run/log/journal в /var/log/journal; * **--rotate** - запустить ротацию логов; * **--no-pager** - выводить информацию из журнала без возможности листать страницы; * **-f** - выводить новые сообщения в реальном времени, как в команде tail; * **--vacuum-time** - очистить логи, давностью больше указанного периода; * **--vacuum-size** - очистить логи, чтобы размер хранилища соответствовал указанному. > **(!)Note**: Если утилита не выводит ничего, выполните её от имени суперпользователя ## Горячие клавиши journalctl По умолчанию информация лога выводится в формате, в котором её можно листать. Для этого можно использовать следующие горячие клавиши: * **Стрелка вниз, Enter, e** или **j** - переместиться вниз на одну строку; * **Стрелка вверх, y** или **k** - переместиться на одну строку вверх; * **Пробел** - переместиться на одну страницу вниз; * **b** - переместиться на одну страницу вверх; * **Стрелка вправо, стрелка влево** - горизонтальна прокрутка; * **g** - перейти на первую строку; * **G** - перейти на последнюю строку; * **p** - перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода; * **/** - поиск по журналу; * **n** - найти следующее вхождение; * **N** - предыдущее вхождение; * **q** - выйти. ## Примеры использования journalctl Вывод journalctl представляет из себя цельный список всех сохраненных сообщений. Если вы запустите команду journalctl без параметров, то получите самые первые сообщения, которые были сохранены. ``` sudo journalctl ``` Формат вывода лога такой: ``` янв 13 20:55:55 sergiy-pc kernel: Linux version 4.15.0-43-generic ``` где: * **янв 13 20:55:55** - дата и время события; * **sergiy-pc** - хост, на котором произошло событие; * **kernel** - источник события, обычно это программа или сервис. В данном случае ядро; * **Linux version 4.15.0-43-generic** - само сообщение. Ниже приводятся примеры фильтрации и перемещения. ### 1.Просмотр логов сервисов Самый частый случай использования journalctl - когда при запуске какого-либо сервиса с помощью systemd, он не запускается и systemd выдает сообщение подобного содержания: **Failed to start service use journalctl -xe for details**. Система сама предлагает какую команду надо выполнить: ``` sudo journalctl -xe ``` эта команда отображает последние сообщения в журнале и добавляет к ним дополнительную информацию, если она есть. Учитывая, что последнее что происходило был не запустившийся сервис, то здесь будут сообщения от него и можно будет понять почему он не запускается. Чтобы отфильтровать сообщения только от определенного сервиса можно использовать опцию -u. Например: ``` sudo journalctl -eu apache2.service ``` ### 2.Просмотр логов в режиме tail С помощью опции -f можно указать утилите, что необходимо выводить новые сообщения в реальном времени: ``` sudo journalctl -f ``` В этом режиме less не поддерживается, поэтому для выхода нажмите сочетание клавиш **Ctrl+C**. ### 3.Просмотр логов загрузки В логе journalctl содержатся все логи, в том числе и логи загрузки. Чтобы открыть лог последней загрузки используйте опцию -b: ``` sudo journalctl -b ``` Посмотреть список всех сохраненных загрузок можно командой: ``` sudo journalctl -list-boots ``` будет выведен список загрузок системы с указанием даты и индентификатора. Теперь, чтобы посмотреть сообщения для нужной загрузки используйте её идентификатор: ``` sudo journalctl -b 37d5c906c9c6404682f029b2c34ec9dc ``` ### 4.Фильтрация по дате С помощью опции --since можно указать дату и время, **начиная с которой** нужно отображать логи: ``` sudo journalctl --since "2019-01-20 15:10:10" ``` Опция --until помогает указать **по какую** дату вы хотите получить информацию: ``` sudo journalctl -e --until "2019-01-20 15:05:50" ``` Или можно скомбинироват эти опции чтобы получить логи за нужный период: ``` sudo journalctl --since "2019-01-20 15:10:10" --until "2019-01-20 15:05:50" ``` ### 5.Журнал ядра Если вы хотите посмотреть только сообщения ядра используйте опцию -k: ``` sudo journalctl -ek ``` ### 6.Настройка формата вывода По умолчанию journalctl выводит информацию с помощью утилиты less, в которой вы можете её удобно листать и просматривать. Но формат вывода можно изменить: * **short** - используется по умолчанию; * **verbose** - также, как и short, только выводится намного больше информации; * **json** - вывод в формате json, одна строка лога в одной строке вывода; * **json-pretty** - форматированный вывод json для более удобного восприятия; * **cat** - отображать только сообщения, без метаданных. Чтобы указать нужный формат используйте опцию -o. Например: ``` sudo journalctl -o json-pretty ``` Или: ``` sudo journalctl -eo json-pretty ``` ### 7.Очистка логов Сначала нужно посмотреть сколько ваши логи занимают на диске. Для этого используется такая команда: ``` sudo journalctl --disk-usage ``` Чтобы уменьшить размер лога можно использовать опцию **--vacuum-size**. Например, если вы хотите, чтобы ваши файлы журналов занимали на диске не более 2 Гб, выполните команду: ``` sudo journalctl --vacuum-size=2G ``` Теперь старые логи будут удалены, пока общий объем хранилища не будет составлять 2 гигабайта. Также можно удалять логи по времени. Для этого используется опция **--vacuum-time**. Например, оставим только логи за последний год: ``` journalctl --vacuum-time=1years ```