## Синтаксис и опции 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** - очистить логи, чтобы размер хранилища соответствовал указанному. ## Горячие клавиши journalctl По умолчанию информация лога выводится в формате, в котором её можно листать. Давайте разберем горячие клавиши, которые вы можете для этого использовать: - **Стрелка вниз, Enter, e** или **j** - переместиться вниз на одну строку; - **Стрелка вверх, y** или **k** - переместиться на одну строку вверх; - **Пробел** - переместиться на одну страницу вниз; - **b** - переместиться на одну страницу вверх; - **Стрелка вправо, стрелка влево** - горизонтальна прокрутка; - **g** - перейти на первую строку; - **G** - перейти на последнюю строку; - **p** - перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода; - **/** - поиск по журналу; - **n** - найти следующее вхождение; - **N** - предыдущее вхождение; - **q** - выйти. ## Шпаргалка по 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"` Кроме даты в формате YYYY-MM-DD в этих опциях можно использовать такие слова, как yesterday, today, и tomorrow. Также допустимы конструкции **1 day ago** (один день назад) или **3 hours ago** (три часа назад). Ещё можно использовать знаки + и -. Например **-1h30min** будет означать полтора часа назад. ### 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`