Главная

Sunday, 11 October 2020

Читаем журналы Linux #2.

Всем привет.

Журналы, журналы журналы - это один из самых важных источников информации при возникновении любых ошибок в операционной системе Linux. Раньше в Linux для сохранения журналов сервисов использовался отдельный демон под названием syslogd. Но с приходом системы инициализации systemd большинство функций касающихся управления сервисами перешли под её управление, в том числе и управление логами.

Теперь для просмотра логов определенного сервиса или загрузки системы используется утилита journalctl. По сравнению с обычными файлами журналов, у 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 - само сообщение.

Частенько при неудачном запуске чего либо система сама предлагает выполнить "Failed to start service use journalctl -xe for details."

sudo journalctl -xe

Чтобы отфильтровать сообщения только от определенного сервиса можно использовать опцию -u. Например:

sudo journalctl -eu zabbix-server.service

С помощью опции -f можно указать утилите, что необходимо выводить новые сообщения в реальном времени:

sudo journalctl -f

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

sudo journalctl -b

Посмотреть список всех сохраненных загрузок можно командой:

sudo journalctl -list-boots

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

sudo journalctl -b 37d5c906c9c6404682f029b2c34ec9dc

С помощью опции --since вы можете указать дату и время, начиная с которой нужно отображать логи:

sudo journalctl --since "2020-08-20 10:10:10"

Опция --until помогает указать по какую дату вы хотите получить информацию:

sudo journalctl -e --until "2020-08-26 15:05:50"

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

sudo journalctl --since "2020-08-20 10:10:10" --until "2020-08-26 15:05:50"

Если вы хотите посмотреть только сообщения ядра используйте опцию -k:

sudo journalctl -ek

По умолчанию journalctl выводит информацию с помощью утилиты less, в которой вы можете её удобно листать и просматривать. Но формат вывода можно изменить:

-short - используется по умолчанию;

-verbose - также, как и short, только выводится намного больше информации;

-json - вывод в формате json, одна строка лога в одной строке вывода;

-json-pretty - форматированный вывод json для более удобного восприятия;

-cat - отображать только сообщения, без метаданных.


Чтобы указать нужный формат используйте опцию -o. Например:

sudo journalctl -o json-pretty


Есть смысл узнать сколько же ваши логи занимают на диске: 

sudo journalctl --disk-usage


Чтобы уменьшить размер лога можно использовать опцию --vacuum-size. Например, если вы хотите, чтобы ваши файлы журналов занимали на диске не более 2 Гб, выполните команду:

sudo journalctl --vacuum-size=2G

Также можно удалять логи по времени. Для этого используется опция --vacuum-time. Например, оставим только логи за последний год:

journalctl --vacuum-time=1years

Для справки основные опции 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 - очистить логи, чтобы размер хранилища соответствовал указанному.


По умолчанию информация лога выводится в формате, в котором её можно листать. 

Горячие клавиши, которые вы можете для этого использовать:

стрелка вниз, Enter, e или j - переместиться вниз на одну строку;

Стрелка вверх, y или k - переместиться на одну строку вверх;

Пробел - переместиться на одну страницу вниз;

b - переместиться на одну страницу вверх;

Стрелка вправо, стрелка влево - горизонтальна прокрутка;

g - перейти на первую строку;

G - перейти на последнюю строку;

p - перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода;

/ - поиск по журналу;

n - найти следующее вхождение;

N - предыдущее вхождение;

q - выйти.


No comments:

Post a Comment

А что вы думаете по этому поводу?