Журналы — это один из самых важных источников информации при возникновении любых ошибок в операционной системе Linux. Я это уже много раз говорил ранее и вот сказал ещё раз. Раньше в Linux для сохранения журналов сервисов использовался отдельный демон под названием syslogd. Но с приходом системы инициализации systemd большинство функций касающихся управления сервисами перешли под её управление. В том числе и управление логами.
Теперь для просмотра логов определенного сервиса или загрузки системы необходимо использовать утилиту journalctl. В этой статье мы разберем примеры использования 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 — очистить логи, чтобы размер хранилища соответствовал указанному.
Горячие клавиши journalctl
По умолчанию информация лога выводится в формате, в котором её можно листать. Давайте разберем горячие клавиши, которые вы можете для этого использовать:
- Стрелка вниз, Enter, e или j — переместиться вниз на одну строку;
- Стрелка вверх, y или k — переместиться на одну строку вверх;
- Пробел — переместиться на одну страницу вниз;
- b — переместиться на одну страницу вверх;
- Стрелка вправо, стрелка влево — горизонтальна прокрутка;
- g — перейти на первую строку;
- G — перейти на последнюю строку;
- p — перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода;
- / — поиск по журналу;
- n — найти следующее вхождение;
- N — предыдущее вхождение;
- q — выйти.
Теперь вы знаете основные опции команды и клавиши, с помощью которых можно ею управлять. Дальше небольшая шпаргалка journalctl.
Шпаргалка по journalctl
Вывод journalctl представляет из себя цельный список всех сохраненных сообщений. Если вы запустите команду journalctl без параметров, то получите самые первые сообщения, которые были сохранены. В моем случае это данные за 13 января:
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"
Кроме даты в формате 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
Выводы
В этой статье мы разобрали как пользоваться journalctl в Linux. Наличие этой утилиты в системе не означает, что теперь вы не можете пользоваться обычными файлами логов. Большинство сервисов как и раньше пишут свои основные логи в файлы, а в лог journalctl пишутся сообщения при старте сервисов, а также различные системные сообщения.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Journalctl — отличный инструмент для анализа логов, обычно один из первых с которым знакомятся начинающие администраторы linux систем. Встроенные возможности ротации, богатые возможности фильтрации и возможность просматривать логи всех systemd unit-сервисов одним инструментом очень удобны и заметно облегчают работу системным администраторам.
Эта статья рассматривает основные возможности утилиты journalctl и различные варианты ее применения. С помощью journalctl можно просматривать логи системы, чтобы решить возникшие проблемы на рабочей станции или сервере использующие дистрибутив linux с демоном инициализации systemd, де-факто уже ставшим стандартом в современных Linux-системах, например: RHEL, CentOS, Fedora, Debian и многих других.
Существует мнение, что systemd не так уж и хорош — он нагружает систему и это все еще предмет для споров на сегодняшний день, но нельзя отрицать, что он предоставляет прекрасный набор инструментов для управления системой и поиска проблем. Представьте, что вам приходится иметь дело с проблемным сервером, который даже не загружается — в таком случае можно загрузиться с live-дистрибутива, смонтировать системный раздел и просмотреть логи systemd, чтобы понять, в чем проблема.
Systemd
Systemd состоит из трех основных компонентов:
- systemd — менеджер системы и сервисов
- systemctl — утилита для просмотра и управление статусом сервисов
- systemd-analyze — предоставляет статистику по процессу загрузки системы, проверяет корректность unit-файлов и так же имеет возможности отладки systemd
Journald
Journald — системный демон журналов systemd. Systemd спроектирован так, чтобы централизованно управлять системными логами от процессов, приложений и т.д. Все такие события обрабатываются демоном journald, он собирает логи со всей системы и сохраняет их в бинарных файлах.
Преимуществ централизованного логирования событий в бинарном формате достаточно много, например системные логи можно транслировать в различные форматы, такие как простой текст, или в JSON, при необходимости. Так же довольно просто можно отследить лог вплоть до одиночного события используя фильтры даты и времени.
Файлы логов journald могут собирать тысячи событий и они обновляются с каждым новым событием, поэтому если ваша Linux-система работает достаточно долго — размер файлов с логами может достигать несколько гигабайт и более. Поэтому анализ таких логов может происходить с задержками, в таком случае, при анализе логов можно фильтровать вывод, чтобы ускорить работу.
Файл конфигурации journald
Файл конфигурации можно найти по следующему пути: /etc/systemd/journald.conf, он содержит различные настройки journald, я бы не рекомендовал изменять этот файл, если вы точно не уверены в том, что делаете.
Каталог с журналом journald располагается /run/log/journal (в том случае, если не настроено постоянное хранение журналов, но об этом позже).
Файлы хранятся в бинарном формате, поэтому нормально их просмотреть с помощью cat или nano, как привыкли многие администраторы — не получится.
Использование journalctl для просмотра и анализа логов
Основная команда для просмотра:
# journalctl
Она выведет все записи из всех журналов, включая ошибки и предупреждения, начиная с того момента, когда система начала загружаться. Старые записи событий будут наверху, более новые — внизу, вы можете использовать PageUp и PageDown чтобы перемещаться по списку, Enter — чтобы пролистывать журнал построчно и Q — чтобы выйти.
По умолчанию journalctl выводит время событий согласно настроенного в вашей системе часового пояса, также journalctl позволяет просмотреть логи с временем UTC (в этом стандарте времени сохраняются события внутри файлов journald), для этого можно использовать команду:
# journalctl --utc
Фильтрация событий по важности
Система записывает события с различными уровнями важности, какие-то события могут быть предупреждением, которое можно проигнорировать, какие-то могут быть критическими ошибками. Если мы хотим просмотреть только ошибки, игнорируя другие сообщения, введем команду с указанием кода важности:
# journalctl -p 0
Для уровней важности, приняты следующие обозначения:
- 0: emergency (неработоспособность системы)
- 1: alerts (предупреждения, требующие немедленного вмешательства)
- 2: critical (критическое состояние)
- 3: errors (ошибки)
- 4: warning (предупреждения)
- 5: notice (уведомления)
- 6: info (информационные сообщения)
- 7: debug (отладочные сообщения)
Когда вы указываете код важности, journalctl выведет все сообщения с этим кодом и выше. Например если мы укажем опцию -p 2, journalctl покажет все сообщения с уровнями 2, 1 и 0.
Настройка хранения журналов
По умолчанию journald перезаписывает свои журналы логов при каждой перезагрузке, и вызов journalctl выведет журнал логов начиная с текущей загрузки системы.
Если необходимо настроить постоянное сохранение логов, потребуется отдельно это настроить, т.к. разработчики отказались от постоянного хранения всех журналов, чтобы не дублировать rsyslog.
Когда в конфигурационном файле /etc/systemd/journald.conf параметру Storage= задано значение auto) и каталога /var/log/journal/ не существует, журнал будет записываться в /run/log/journal без сохранения между перезагрузками, если /var/log/journal/ существует, журналы будут сохраняться в нем, на постоянной основе, но если каталог будет удален, systemd не пересоздаст его автоматически и вместо этого будет вести журнал снова в /run/systemd/journal без сохранения. Каталог может быть пересоздан в таком случае, если добавить Storage=persistent в journald.conf и перезапустить systemd-journald.service (или перезагрузиться).
Создадим каталог для хранения журналов, установим необходимые атрибуты и перезапустим службу:
# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
Просмотр журналов загрузки
Если journald был настроен на постоянное хранение журналов, мы можем просматривать журналы логов по каждой отдельной загрузке, следующая команда выведет список журналов:
# journalctl --list-boots
Первый номер показывает номер журнала, который можно использовать для просмотра журнала определенной сессии. Второй номер boot ID так же можно использовать для просмотра отдельного журнала.
Следующие две даты, промежуток времени в течении которого в него записывались логи, это удобно если вы хотите найти логи за определенный период.
Например, чтобы просмотреть журнал начиная с текущего старта системы, можно использовать команду:
# journalctl -b 0
А для того, чтобы просмотреть журнал предыдущей загрузки:
# journalctl -b -1
Просмотр журнала за определенный период времени
Journalctl позволяет использовать такие служебные слова как “yesterday” (вчера), “today” (сегодня), “tomorrow” (завтра), или “now” (сейчас).
Поэтому мы можем использовать опцию «—since» (с начала какого периода выводить журнал).
С определенной даты и времени:
# journalctl --since "2020-12-18 06:00:00"
С определенной даты и по определенное дату и время:
# journalctl --since "2020-12-17" --until "2020-12-18 10:00:00
Со вчерашнего дня:
# journalctl --since yesterday
С 9 утра и до момента, час назад:
# journalctl --since 09:00 --until "1 hour ago"
Просмотр сообщений ядра
Чтобы просмотреть сообщения от ядра Linux за текущую загрузку, используйте команду с ключом -k:
# journalctl -k
Просмотр журнала логов для определенного сервиса systemd или приложения
Вы можете отфильтровать логи по определенному сервису systemd. Например, что бы просмотреть логи от NetworkManager, можно использовать следующую команду:
# journalctl -u NetworkManager.service
Если нужно найти название сервиса, используйте команду:
# systemctl list-units --type=service
Так же можно просмотреть лог приложения, указав его исполняемый файл, например чтобы просмотреть все сообщения от nginx за сегодня, мы можем использовать команду:
# journalctl /usr/sbin/nginx --since today
Или указав конкретный PID:
# journalctl _PID=1
Дополнительные опции просмотра
Следить за появлением новых сообщений (аналог tail -f):
# journalctl -f
Открыть журнал «перемотав» его к последней записи:
# journalctl -e
Если в каталоге с журналами очень много данных, то фильтрация вывода journalctl может занять некоторое время, процесс можно значительно ускорить с помощью опции —file, указав journalctl только нужный нам журнал, за которым мы хотим следить:
journalctl --file /var/log/journal/e02689e50bc240f0bb545dd5940ac213/system.journal -f
По умолчанию journalctl отсекает части строк, которые не вписываются в экран по ширине, хотя иногда перенос строк может оказаться более предпочтительным. Управление этой возможностью производится посредством переменной окружения SYSTEMD_LESS, в которой содержатся опции, передаваемые в less (программу постраничного просмотра, используемую по умолчанию). По умолчанию переменная имеет значение FRSXMK, если убрать опцию S, строки не будут обрезаться.
Например:
SYSTEMD_LESS=FRXMK journalctl
Ограничение размера журнала
Если journald настроен что бы сохранять журналы после перезагрузки, то по умолчанию размер журнала ограничен 10% от объема файлового раздела и максимально может занять 4 Гб дискового пространства.
Максимальный объем журнала можно скорректировать, раскомментировав и отредактировав следующий параметр в файле конфигурации journald:
SystemMaxUse=50M
Удаление журналов
Удалить файлы архивных журналов, можно вручную с помощью rm или использовав journalctl.
Удалить журналы, оставив только последние 100 Мб:
# journalctl --vacuum-size=100M
Удалить журналы, оставив журналы только за последние 7 дней:
# journalctl --vacuum-time=7d
Заключение
Служба журналирования логов journald очень мощный и гибкий инструмент, и если вы знаете как его использовать, он может сделать вашу жизнь намного проще во время поиска причин проблем с системой или ее сервисами.
Журналы — это один из самых важных источников информации при возникновении любых ошибок в операционной системе Linux. Я это уже много раз говорил ранее и вот сказал ещё раз. Раньше в Linux для сохранения журналов сервисов использовался отдельный демон под названием syslogd. Но с приходом системы инициализации systemd большинство функций касающихся управления сервисами перешли под её управление. В том числе и управление логами.
Теперь для просмотра логов определенного сервиса или загрузки системы необходимо использовать утилиту journalctl. В этой статье мы разберем примеры использования 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 — очистить логи, чтобы размер хранилища соответствовал указанному.
Горячие клавиши journalctl
По умолчанию информация лога выводится в формате, в котором её можно листать. Давайте разберем горячие клавиши, которые вы можете для этого использовать:
- Стрелка вниз, Enter, e или j — переместиться вниз на одну строку;
- Стрелка вверх, y или k — переместиться на одну строку вверх;
- Пробел — переместиться на одну страницу вниз;
- b — переместиться на одну страницу вверх;
- Стрелка вправо, стрелка влево — горизонтальна прокрутка;
- g — перейти на первую строку;
- G — перейти на последнюю строку;
- p — перейти на позицию нужного процента сообщений. Например, 50p перенесет курсор на середину вывода;
- / — поиск по журналу;
- n — найти следующее вхождение;
- N — предыдущее вхождение;
- q — выйти.
Теперь вы знаете основные опции команды и клавиши, с помощью которых можно ею управлять. Дальше небольшая шпаргалка journalctl.
Шпаргалка по journalctl
Вывод journalctl представляет из себя цельный список всех сохраненных сообщений. Если вы запустите команду journalctl без параметров, то получите самые первые сообщения, которые были сохранены. В моем случае это данные за 13 января:
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"
Кроме даты в формате 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
Выводы
В этой статье мы разобрали как пользоваться journalctl в Linux. Наличие этой утилиты в системе не означает, что теперь вы не можете пользоваться обычными файлами логов. Большинство сервисов как и раньше пишут свои основные логи в файлы, а в лог journalctl пишутся сообщения при старте сервисов, а также различные системные сообщения.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Ядро Linux — это ядро операционной системы, которое контролирует доступ к системным ресурсам, таким как процессор, устройства ввода-вывода, физическая память и файловые системы. Ядро записывает различные сообщения в кольцевой буфер ядра в процессе загрузки и во время работы системы. Эти сообщения содержат различную информацию о работе системы.
Кольцевой буфер ядра — это часть физической памяти, которая содержит сообщения журнала ядра. Он имеет фиксированный размер, что означает, что после заполнения буфера старые записи журналов перезаписываются.
dmesg -
Утилита командной строки используется для печати и управления кольцевого буфера ядра в Linux и других Unix-подобных операционных систем. Это полезно для изучения загрузочных сообщений ядра и устранения проблем, связанных с оборудованием.
Использование dmesg
команды
Синтаксис dmesg
команды следующий:
При вызове без каких-либо параметров dmesg
записывает все сообщения из кольцевого буфера ядра в стандартный вывод:
dmesg
По умолчанию все пользователи могут запускать dmesg
команду. Однако в некоторых системах доступ к ним dmesg
может быть ограничен для пользователей без полномочий root. В этой ситуации при вызове dmesg
вы получите сообщение об ошибке, как показано ниже:
dmesg: read kernel buffer failed: Operation not permitted
Параметр ядра kernel.dmesg_restrict
указывает, могут ли непривилегированные пользователи dmesg
просматривать сообщения из буфера журнала ядра. Чтобы снять ограничения, установите его на ноль:
sudo sysctl -w kernel.dmesg_restrict=0
Обычно выходные данные содержат много строк информации, так что только последняя часть выходных данных является видимой. Чтобы увидеть одну страницу за раз, перенаправьте вывод в утилиту пейджера, такую как less
или more
:
dmesg --color=always | less
--color=always
Используется для сохранения цветного вывода.
Если вы хотите фильтровать сообщения буфера, используйте grep
. Например, чтобы просмотреть только сообщения, связанные с USB, вы должны набрать:
dmesg | grep -i usb
читает сообщения, сгенерированные ядром, из
dmesg /proc/kmsg
виртуального файла. Этот файл предоставляет интерфейс к кольцевому буферу ядра и может быть открыт только одним процессом. Если syslog
в вашей системе запущен процесс, и вы пытаетесь прочитать файл с помощью cat
, или less
, команда зависнет.
syslog
Демон отвалов сообщения ядра /var/log/dmesg
, так что вы можете использовать этот файл журнала:
cat /var/log/dmesg
Форматирование dmesg
вывода
Команда dmesg
предоставляет ряд опций, которые помогут вам отформатировать и отфильтровать вывод.
Одна из наиболее часто используемых опций dmesg
— это -H
( --human
), которая обеспечивает удобочитаемый вывод. Эта опция направляет вывод команды в пейджер:
dmesg -H
Для печати удобочитаемых временных меток используйте опцию -T
( --ctime
):
dmesg -T
[Mon Oct 14 14:38:04 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
Формат --time-format <format>
отметок времени также может быть установлен с помощью параметра, который может быть ctime, reltime, delta, notime или iso. Например, чтобы использовать дельта-формат, введите:
dmesg --time-format=delta
Вы также можете объединить два или более вариантов:
dmesg -H -T
Чтобы просмотреть вывод dmesg
команды в режиме реального времени, используйте параметр -w
( --follow
):
dmesg --follow
Фильтрация dmesg
вывода
Вы можете ограничить dmesg
вывод данными объектами и уровнями.
Средство представляет процесс, который создал сообщение. dmesg
поддерживает следующие возможности журнала:
kern
— сообщения ядраuser
— сообщения уровня пользователяmail
— почтовая системаdaemon
— системные демоныauth
— сообщения безопасности / авторизацииsyslog
— внутренние сообщения syslogdlpr
— подсистема линейного принтераnews
— подсистема сетевых новостей
Опция -f
( --facility <list>
) позволяет ограничить вывод определенными объектами. Опция принимает одно или несколько разделенных запятыми объектов.
Например, для отображения только сообщений ядра и системных демонов вы должны использовать:
dmesg -f kern,daemon
Каждое сообщение журнала связано с уровнем журнала, который показывает важность сообщения. dmesg
поддерживает следующие уровни журнала:
emerg
— система неработоспособнаalert
— действие должно быть предпринято немедленноcrit
— критические условияerr
— условия ошибкиwarn
— условия предупрежденияnotice
— нормальное, но значимое состояниеinfo
— информационныйdebug
— сообщения уровня отладки
Опция -l
( --level <list>
) ограничивает вывод определенными уровнями. Опция принимает один или несколько уровней, разделенных запятыми.
Следующая команда отображает только сообщения об ошибках и критические сообщения:
dmesg -l err,crit
Очистка кольцевого буфера
Опция -C
( --clear
) позволяет очистить кольцевой буфер:
sudo dmesg -C
Только root или пользователи с привилегиями sudo могут очистить буфер.
Чтобы распечатать содержимое буфера перед очисткой, используйте параметр -c
( --read-clear
):
sudo dmesg -c
Если вы хотите сохранить текущие dmesg
журналы в файле перед его очисткой, перенаправьте вывод в файл:
dmesg > dmesg_messages
Вывод
Команда dmesg
позволяет вам просматривать и контролировать кольцевой буфер ядра. Это может быть очень полезно при устранении проблем с ядром или оборудованием.
Введите man dmesg
в своем терминале информацию о всех доступных dmesg
опциях.
Анализ логов является важной задачей системного администратора. Если что-то идет не так в системе Linux, ответ часто находится в логах. На CentOS 7 две разные системы логирования используются бок о бок, и важно знать, как и где найти информацию. Эта статья научит вас всему этому. Вы узнаете, как читать логи, настраивать rsyslogd и journald, а также как настроить свою систему на ротацию логов, чтобы предотвратить полное заполнение дисков службами, которые регистрируют события в этих самых логах.
Понимание логирования
Большинство сервисов, используемых на сервере Linux, записывают информацию в лог-файлы. Эта информация может быть записана в разных местах, и существует несколько решений для поиска соответствующей информации в системных логах. Сервисы могут использовать не менее трех разных подходов для записи информации в логи:
- Прямая запись: некоторые сервисы записывают информацию напрямую в лог-файлы, даже некоторые важные сервисы, такие как веб-сервер Apache и файловый сервер Samba.
- rsyslogd: rsyslogd — это усовершенствование сервиса syslogd, который занимается централизованным управлением лог-файлов. Syslogd существует уже давно.
- journald: с введением systemd также был представлен сервис логирования journald. Этот сервис тесно интегрирован с systemd, что позволяет администраторам читать подробную информацию из journald, одновременно отслеживая состояние сервиса с помощью команды systemctl status.
Понимание ролей rsyslogd и journald
journald (который реализуется демоном systemd-journald) предоставляет усовершенствованную систему управления логами. journald собирает сообщения из ядра, всей процедуры загрузки и сервисов и записывает эти сообщения в журнал событий. Этот журнал событий хранится в двоичном формате, и его можно запросить с помощью команды journalctl.
Поскольку журнал, который пишет journald, не является постоянным между перезагрузками, сообщения также перенаправляются в службу rsyslogd. rsyslogd записывает сообщения в разные файлы в каталоге /var/log.
rsyslogd предлагает функции, которых нет в journald, такие как централизованное ведение журнала и фильтрация сообщений с использованием модулей. В текущем состоянии journald не является заменой rsyslogd; это просто еще один способ регистрации информации. journald тесно интегрирован с systemd и поэтому регистрирует всё, что делает ваш сервер. rsyslogd добавляет к нему некоторые сервисы. В частности, он заботится о записи данных журнала в определенные файлы (которые будут постоянными между перезагрузками) и позволяет настраивать удаленные журналы и серверы журналов.
Чтобы получить больше информации о том, что происходит на машине, администраторы должны использовать три подхода:
- Файлы в /var/log, которые пишутся rsyslogd, должны контролироваться.
- Команда journalctl может использоваться для получения более подробной информации из журнала.
- Для краткого обзора последних значимых событий, которые были зарегистрированы модулями systemd через journald, администраторы могут использовать команду systemctl status <unit>. Эта команда показывает состояние сервисов, а также последние пару строк, которые были логированы. В листинге 1 показан пример, в котором эта команда четко указывает, что пошло не так при запуске сервиса.
Листинг 1
[root@server1 ~]# systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
Active: failed (Result: exit-code) since Fri 2019-10-25 05:25:18
PDT; 2s ago
Process: 2893 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited,
status=0/SUCCESS)
Process: 2890 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
(code=exited, status=1/FAILURE)
Main PID: 2890 (code=exited, status=1/FAILURE)
Oct 25 05:25:18 server1.example.com httpd[2890]: (13)Permission
denied: AH00072: make_sock: could not bind to address [::]:443
Oct 25 05:25:18 server1.example.com httpd[2890]: (13)Permission
denied: AH00072: make_sock: could not bind to address 0.0.0.0:443
Oct 25 05:25:18 server1.example.com httpd[2890]: no listening sockets
available, shutting down
Oct 25 05:25:18 server1.example.com httpd[2890]: AH00015: Unable to
open logs
Oct 25 05:25:18 server1.example.com systemd[1]: httpd.service: main
process exited, code=exited, status=1/FAILURE
Oct 25 05:25:18 server1.example.com systemd[1]: Failed to start The
Apache HTTP Server.
Oct 25 05:25:18 server1.example.com systemd[1]: Unit httpd.service
entered failed state.
Чтение лог-файлов
Помимо сообщений, которые записываются journald и которые можно прочитать с помощью команды journalctl, в системе Linux вы также найдете различные лог-файлы в каталоге /var/log. Эти файлы могут быть прочитаны, например, с помощью less.
Точное количество файлов в каталоге /var/log будет меняться в зависимости от конфигурации сервера и сервисов, работающих на этом сервере. Однако некоторые файлы существуют в большинстве случаев, и, как администратор, вы должны знать, какие это файлы и какое содержимое можно ожидать в этих файлах.
В таблице 1 представлен обзор некоторых стандартных файлов, созданных в этом каталоге.
Таблица 1
log-файл | Объяснение |
/var/log/messages | Наиболее часто используемый файл журнала, это общий файл журнала, в который записывается большинство сообщений. |
/var/log/dmesg | Содержит сообщения журнала ядра. |
/var/log/secure | Содержит сообщения, связанные с аутентификацией. |
/var/log/boot.log | Сообщения, связанные с запуском системы. |
/var/log/audit/audit.log | Содержит сообщения аудита. SELinux пишет в этот файл. |
/var/log/maillog | Сообщения, связанные с почтой. |
/var/log/samba | Предоставляет файлы журналов для сервиса Samba. Обратите внимание, что по умолчанию Samba не управляется через rsyslog, а записывается непосредственно в каталог /var/log. |
/var/log/sssd | Содержит сообщения, записанные сервисом sssd, который играет важную роль в процессе аутентификации. |
/var/log/cups | Содержит сообщения, сгенерированные службой печати CUPS. |
/var/log/httpd/ | Каталог, содержащий лог-файлы, которые записываются веб-сервером Apache. Обратите внимание, что Apache пишет сообщения в эти файлы напрямую, а не через rsyslog. |
Понимание содержимого лог-файла
Как администратор, вы должны уметь интерпретировать содержимое лог-файлов. Например, в листинге 2 показан частичный контент из файла /var/log/messages.
Листинг 2
[root@kvm ~]# tail -n 20 /var/log/messages
Oct 31 22:05:56 kvm journal: g_array_unref: assertion 'array' failed
Oct 31 22:06:09 kvm dhclient[24837]: DHCPDISCOVER on em1 to 255.255.255.255 port 67 interval 15 (xid=0x278ccc34)
Oct 31 22:06:24 kvm dhclient[24837]: DHCPDISCOVER on em1 to 255.255.255.255 port 67 interval 16 (xid=0x278ccc34)
Oct 31 22:06:26 kvm NetworkManager[2577]: <warn> [1572523586.5185] dhcp4 (em1):request timed out
Oct 31 22:06:26 kvm NetworkManager[2577]: <info> [1572523586.5186] dhcp4 (em1):state changed unknown -> timeout
Oct 31 22:06:26 kvm NetworkManager[2577]: <info> [1572523586.5270] dhcp4 (em1):canceled DHCP transaction, DHCP client pid 24837
Oct 31 22:06:26 kvm NetworkManager[2577]: <info> [1572523586.5270] dhcp4 (em1):state changed timeout -> done
Oct 31 22:06:26 kvm NetworkManager[2577]: <info> [1572523586.5274] device (em1): state change: ip-config -> failed (reason 'ip-config-unavailable', sys-iface-state: 'managed')
Oct 31 22:06:26 kvm NetworkManager[2577]: <warn> [1572523586.5284] device (em1): Activation: failed for connection 'Wired connection 1'
Oct 31 22:06:26 kvm NetworkManager[2577]: <info> [1572523586.5288] device (em1): state change: failed -> disconnected (reason 'none', sys-iface-state: 'managed')
Oct 31 22:06:26 kvm avahi-daemon[2499]: Withdrawing address record for fe80::6bbe:cb13:850c:d799 on em1.
Oct 31 22:06:41 kvm journal: g_array_unref: assertion 'array' failed
Oct 31 22:10:01 kvm systemd: Created slice User Slice of root.
Oct 31 22:10:01 kvm systemd: Started Session 413 of user root.
Oct 31 22:10:01 kvm systemd: Removed slice User Slice of root.
Oct 31 22:10:08 kvm systemd-logind: New session 414 of user admin.
Oct 31 22:10:08 kvm systemd: Started Session 414 of user admin.
Oct 31 22:10:08 kvm dbus[2512]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
Oct 31 22:10:08 kvm dbus[2512]: [system] Successfully activated service 'org.freedesktop.problems'
Oct 31 22:10:15 kvm su: (to root) admin on pts/11
Как видно из листинга 2, каждая записываемая строка имеет определенные элементы:
- Дата и время: каждое сообщение начинается с отметки времени. В целях фильтрации метка времени записывается как военное время.
- Хост: хост, с которого отправлено сообщение. Это важно, потому что rsyslogd также может быть настроен для обработки удаленных логов.
- Имя службы или процесса: имя сервиса или процесса, сгенерировавшего сообщение.
- Содержимое сообщения: содержимое сообщения, которое содержит точное сообщение, которое было зарегистрировано.
Чтобы прочитать содержимое лог-файла, вы можете использовать, например less, или вы можете в реальном времени наблюдать за тем, что там происходит с помощью команды tail -f. Например: tail -f /var/log/messages.
Команда logger
Большинство сервисов самостоятельно записывают информацию в лог-файлы. Команда logger позволяет пользователям записывать сообщения в rsyslog из командной строки. Использовать эту команду просто. Просто введите logger, и затем сообщение, которое вы хотите записать в логи. Таким образом, утилита logger предлагает удобное решение для написания сообщений из скриптов. Это позволит вам записывать скрипт в syslog, если что-то пойдёт не так.
При использовании logger вы также можете указать приоритет и что вы хотите логировать. Команда logger -p kern.err my_message записывает my_message в объект kern, например, используя приоритет error. Эта опция позволит проверить работу конкретных rsyslog объектов.
Настройка rsyslogd
Чтобы убедиться, что информация, которая должна быть залогирована, записана в то место, где вы хотите ее найти, вы можете настроить сервис rsyslogd в файле /etc/rsyslog.conf. В этом файле вы найдете различные разделы, которые позволяют указать, где и как должна быть записана информация.
Секции rsyslog.conf
Файл rsyslog.conf используется для указания того, что должно быть зарегистрировано и где это должно быть зарегистрировано. Для этого вы найдете различные разделы в файле конфигурации:
■ #### MODULES ####: rsyslogd является модульным. Модули включены для улучшения поддерживаемых функций в rsyslogd.
■ #### GLOBAL DIRECTIVES ####: Этот раздел используется для указания глобальных параметров, таких как место, где записываются вспомогательные файлы, или формат метки времени по умолчанию.
■ #### RULES ####: Это самая важная часть файла rsyslog.conf. Он содержит правила, которые определяют, какая информация должна быть залогирована и в каком месте.
Объекты, приоритеты, и места назначения
Чтобы указать, какая информация должна логироваться и в каком месте назначения, rsyslogd использует объект (Facility), приоритет (Priority) и место назначения (Destination):
■ Объект определяет категорию информации, которая логируется. Rsyslogd использует фиксированный список объектов, который не может быть расширен. Это связано с обратной совместимостью с устаревшей службой syslog.
■ Приоритет используется для определения серьезности сообщения, которое необходимо залогировать.
При указании приоритета по умолчанию с таким приоритетом логируются все сообщения, а так же все сообщения с приоритетом выше текущего.
■ Назначение определяет, куда должно быть записано сообщение. Типичными адресатами являются файлы, но модули rsyslog также могут использоваться в качестве места назначения для дальнейшей обработки через модуль rsyslogd.
В листинге 3 приведен пример раздела RULES в rsyslog.
Листинг 3
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
В листинге 3 вы можете увидеть, как различные объекты и приоритеты используются для определения местоположений, в которые можно логировать информацию. Доступные объекты и приоритеты являются фиксированными и не могут быть добавлены. Таблица 2 показывает, какие объекты доступны, а таблица 3 показывает список всех приоритетов.
При указании назначения часто используется файл. Если имя файла начинается с дефиса (как -/var/log/maillog), сообщения не будут немедленно переданы в файл, а будут буферизированы для повышения эффективности записи. Файлы устройств также могут быть использованы, как /dev/console. Если используется устройство, сообщения записываются в режиме реального времени на консоль. На современных серверах это не имеет смысла, поскольку администраторы часто входят в систему удаленно и не видят, что происходит на консоли сервера.
Для расширения функциональности rsyslogd могут использоваться модули для дальнейшей обработки сообщений. Если это требуется, имя модуля может быть указано как :имя_модуля:.
Таблица 2
Объект | Что логируется |
auth / authpriv | Сообщения, связанные с аутентификацией. |
cron | Сообщения, сгенерированные сервисом crond. |
daemon | Универсальный объект, который можно использовать для неопределенных демонов. |
kern | Сообщения ядра. |
lpr | Сообщения, сгенерированные через систему печати. |
Сообщения, связанные с электронной почтой. | |
mark | Специальный объект, который можно использовать для периодической записи маркера. |
news | Сообщения, генерируемые системой новостей NNTP. |
security | То же, что и auth / authpriv. Не должен больше использоваться. |
syslog | Сообщения, генерируемые системой syslog. |
user | Сообщения генерируемые в пространстве пользователя. |
uucp | Сообщения, сгенерированные устаревшей системой UUCP. |
local0-7 | Резервные объекты, которые необходимы для использования тех объектов, которые отсутствуют в этой таблице. |
Объекты syslog были определены в 1980-х годах, и для обеспечения обратной совместимости никакие новые объекты не могут быть добавлены. В результате все еще существуют некоторые объекты, которые в основном больше не используются, а некоторые сервисы, которые стали актуальными на более позднем этапе, не имеют своего собственного объекта. Как решение, два конкретных типа объекта могут быть использованы. Объект daemon — это общий объект, который может использоваться любым демоном. И могут быть использованы объекты local0 — local7.
Если есть сервисы, которые не имеют своих собственных объектов rsyslogd, которым необходимо в любом случае записывать сообщения в определенный лог-файл, эти сервисы можно настроить для использования любого из объектов от local0 до local7. Затем вы должны настроить сервисы для использования этих объектов. Процедура, которой вы пользуетесь, зависит от используемого вами сервиса. Затем вам нужно добавить правило в файл rsyslog.conf, чтобы отправлять сообщения, поступающие через этот объект, в определенный флог-файл. Упражнение 2 показывает, как вы можете это сделать.
Чтобы определить, какие типы сообщений должны логироваться, в строках rsyslog.conf могут использоваться разные уровни серьезности. Эти серьезности являются syslog-приоритетами. В таблице 3 представлен обзор доступных приоритетов в порядке возрастания.
Таблица 3
Приоритет | Используется для |
debug | Отладочные сообщения, которые дадут как можно больше информации о работе сервиса. |
info | Информационные сообщения о нормальной работе сервиса. |
notice | Используется для информационных сообщений об элементах, которые позже могут стать проблемой. |
warning / warn | Что-то не оптимальное, но ошибки пока нет. |
err /error | Произошла некритическая ошибка. |
crit | Произошла критическая ошибка. |
alert | Используется, когда сервис перестал быть доступен. |
emerg / panic | Сообщение генерируется, когда доступность сервиса прекращается. |
Когда используется определенный приоритет, все сообщения с этим приоритетом и выше логируются в соответствии со спецификациями, используемыми в этом конкретном правиле. Если вам необходимо детально настроить логирование, когда сообщения с разными приоритетами отправляются в разные файлы, вы можете указать приоритет со знаком равенства (=) перед ним, как в следующем файле конфигурации, который будет отправлять все отладочные сообщения cron в файл с именем /var/log/cron.debug. Обратите внимание на использование дефиса (-) перед именем файла, который гарантирует, что сообщения буферизуются и не записываются немедленно на диск (что хорошо для производительности диска).
Рассмотрим следующую строку, где все сообщения cron только с приоритетом отладки записываются в определенный файл. Обратите внимание на — перед строкой, который буферизует записи, чтобы информация логировалась более эффективным способом:
cron.=debug -/var/log/cron.debug
Нет необходимости учить наизусть названия rsyslogd объектов и приоритетов. Все они перечислены в man 5 rsyslog.conf.
Упражнение 2. Изменение правил в rsyslog.conf
В этом упражнении вы узнаете, как изменить rsyslog.conf. Вы настроите сервис Apache для логирования сообщений через syslog и создадите правило, которое записывает сообщения отладки в определенный файл.
1. По умолчанию сервис Apache не логируется через rsyslog, но ведет собственное логирование. Вы измените это. Для начала установите Apache командой yum install -y httpd.
2. После установки Apache откройте его файл конфигурации /etc/http/conf/httpd.conf и добавьте в него следующую строку:
ErrorLog syslog:local1
3. Введите systemctl restart httpd.
4. Теперь создайте строку в файле rsyslog.conf, которая будет отправлять все сообщения, которые он получает для объекта local1 (который теперь используется сервисом httpd), в файл /var/log/httpd-error.log. Для этого включите следующую строку:
local1:error -/var/log/httpd-error.log
5. Скажите rsyslogd перезагрузить его конфигурацию, выполнив команду systemctl restart httpd.
6. Все сообщения об ошибках Apache теперь будут записываться в файл httpd-error.log.
7. В браузере Firefox перейдите по адресу http://localhost/nowhere. Так как страницы, к которой вы пытаетесь получить доступ, не существует, она будет записана в журнал ошибок Apache.
8. Теперь давайте создадим snap-in файл, который также записывает сообщения отладки в определенный файл. Для этого введите echo «*.debug /var/log/messages/messages-debug» > /etc/rsyslogd/debug.conf.
9. Снова перезапустите rsyslogd с помощью systemctl restart rsyslogd.
10. Выполните tail -f /var/log/messages-debug, чтобы открыть трассировку для вновь созданного файла.
11. Введите logger -p daemon.debug «Daemon Debug Message». Вы увидите сообщение отладки.
Ротация лог-файлов
Чтобы syslog сообщения не заполняли вашу систему, сообщения можно ротировать. Это означает, что когда будет достигнут определенный порог,
старый лог-файл закроется и откроется новый. Утилита logrotate периодически запускается через сервис crond, чтобы позаботиться о ротации лог-файлов.
Когда лог-файл ротируется, старый файл копируется в файл с датой ротации. Таким образом, если /var/log/messages ротируется 3 ноября 2019 года, то ротируемое имя файла будет /var/log/messages-20191103. По умолчанию в системе хранятся четыре старых лог-файлов. Файлы старше этого периода удаляются из системы автоматически.
ВНИМАНИЕ! Лог-файлы, которые были ротированы, нигде не хранятся; они просто исчезают. Если политика вашей компании требует от вас доступа к информации о событиях, которые произошли более 5 недель назад, вам следует принять меры. Вы можете либо создать резервную копию лог-файлов, либо настроить сервер логов, где logrotate хранит ротированные сообщения в течение значительно более длительного периода.
Настройки по умолчанию для ротации логов хранятся в файле /etc/logrotate.conf
[root@kvm ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
[root@kvm ~]#
Наиболее важные настройки, используемые в этом файле конфигурации, заставляют logrotate еженедельно ротировать файлы и сохранять четыре старые версии файла. Вы можете получить больше информации о других параметрах в этом файле с помощью команды man logrotate.
Если для определенных файлов требуются определенные настройки, вы можете создать файл конфигурации для этого файла в /etc/logrotate.d. Настройки для этого файла перезаписывают настройки по умолчанию в /etc/logrotate.conf.
Работаем с journald
Сервис systemd-journald хранит лог-сообщения в журнале в двоичном виде, который хранится в файле /run/log/journal. Этот файл можно просмотреть с помощью команды journalctl.
Использование journalctl для поиска событий
Самый простой способ использовать journalctl — просто набрать команду. Он показывает последние события, которые были записаны в журнал с момента последнего запуска вашего сервера. Обратите внимание, что результат этой команды отображается в меньшем количестве страниц, и по умолчанию вы увидите начало журнала.
Поскольку журнал записывается с момента загрузки сервера, в нем отображаются сообщения журнала, связанные с загрузкой. Если вы хотите просмотреть последние сообщения, которые были зарегистрированы, вы можете использовать journalctl -f, который показывает последние строки сообщений, в которые автоматически добавляются новые строки журнала.
Вы также можете ввести journalctl и нажать кнопку G (заглавная буква) , чтобы перейти к концу журнала. Также обратите внимание, что в выводе journalctl работают параметры поиска / и ?. В листинге 4 показан частичный вывод journalctl.
Листинг 4
Nov 03 13:39:03 kvm NetworkManager[2577]: <info> [1572752343.5648] device (em2): state change: config -> ip-config (reason 'none', sys
Nov 03 13:39:03 kvm NetworkManager[2577]: <info> [1572752343.5652] dhcp4 (em2): activation: beginning transaction (timeout in 45 secon
Nov 03 13:39:03 kvm NetworkManager[2577]: <info> [1572752343.5672] dhcp4 (em2): dhclient started with pid 23750
Nov 03 13:39:03 kvm avahi-daemon[2499]: Registering new address record for fe80::8cce:3bf7:7f8b:9335 on em2.*.
Nov 03 13:39:03 kvm dhclient[23750]: DHCPDISCOVER on em2 to 255.255.255.255 port 67 interval 7 (xid=0x48a6ece5)
Nov 03 13:39:10 kvm dhclient[23750]: DHCPDISCOVER on em2 to 255.255.255.255 port 67 interval 12 (xid=0x48a6ece5)
Nov 03 13:39:18 kvm gnome-shell[3798]: g_array_unref: assertion 'array' failed
Nov 03 13:39:22 kvm dhclient[23750]: DHCPDISCOVER on em2 to 255.255.255.255 port 67 interval 20 (xid=0x48a6ece5)
Nov 03 13:39:42 kvm dhclient[23750]: DHCPDISCOVER on em2 to 255.255.255.255 port 67 interval 18 (xid=0x48a6ece5)
Nov 03 13:39:48 kvm NetworkManager[2577]: <warn> [1572752388.5190] dhcp4 (em2): request timed out
Nov 03 13:39:48 kvm NetworkManager[2577]: <info> [1572752388.5191] dhcp4 (em2): state changed unknown -> timeout
Nov 03 13:39:48 kvm NetworkManager[2577]: <info> [1572752388.5281] dhcp4 (em2): canceled DHCP transaction, DHCP client pid 23750
Nov 03 13:39:48 kvm NetworkManager[2577]: <info> [1572752388.5281] dhcp4 (em2): state changed timeout -> done
Nov 03 13:39:48 kvm NetworkManager[2577]: <info> [1572752388.5284] device (em2): state change: ip-config -> failed (reason 'ip-config-
Nov 03 13:39:48 kvm NetworkManager[2577]: <warn> [1572752388.5291] device (em2): Activation: failed for connection 'Wired connection 2
Nov 03 13:39:48 kvm NetworkManager[2577]: <info> [1572752388.5295] device (em2): state change: failed -> disconnected (reason 'none',
Nov 03 13:39:48 kvm avahi-daemon[2499]: Withdrawing address record for fe80::8cce:3bf7:7f8b:9335 on em2.
Nov 03 13:40:01 kvm systemd[1]: Created slice User Slice of root.
Nov 03 13:40:01 kvm systemd[1]: Started Session 867 of user root.
Nov 03 13:40:01 kvm CROND[23918]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Nov 03 13:40:01 kvm systemd[1]: Removed slice User Slice of root.
Nov 03 13:40:03 kvm gnome-shell[3798]: g_array_unref: assertion 'array' failed
Nov 03 13:41:12 kvm dnsmasq-dhcp[3529]: DHCPREQUEST(virbr1) 192.168.122.208 52:54:00:01:b4:d3
Nov 03 13:41:12 kvm dnsmasq-dhcp[3529]: DHCPACK(virbr1) 192.168.122.208 52:54:00:01:b4:d3
Nov 03 13:43:16 kvm dnsmasq-dhcp[3529]: DHCPREQUEST(virbr1) 192.168.122.169 52:54:00:d2:7d:a4
Nov 03 13:43:16 kvm dnsmasq-dhcp[3529]: DHCPACK(virbr1) 192.168.122.169 52:54:00:d2:7d:a4
Nov 03 13:43:27 kvm dnsmasq-dhcp[3529]: DHCPREQUEST(virbr1) 192.168.122.145 52:54:00:66:3d:c4
Nov 03 13:43:27 kvm dnsmasq-dhcp[3529]: DHCPACK(virbr1) 192.168.122.145 52:54:00:66:3d:c4 server2
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6056] policy: auto-activating connection 'Wired connection 2' (17698f02-4
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6067] device (em2): Activation: starting connection 'Wired connection 2'
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6068] device (em2): state change: disconnected -> prepare (reason 'none',
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6073] device (em2): state change: prepare -> config (reason 'none', sys-i
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6339] device (em2): state change: config -> ip-config (reason 'none', sys
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6347] dhcp4 (em2): activation: beginning transaction (timeout in 45 secon
Nov 03 13:44:48 kvm NetworkManager[2577]: <info> [1572752688.6396] dhcp4 (em2): dhclient started with pid 24344
Nov 03 13:44:48 kvm avahi-daemon[2499]: Registering new address record for fe80::8cce:3bf7:7f8b:9335 on em2.*.
Nov 03 13:44:48 kvm dhclient[24344]: DHCPDISCOVER on em2 to 255.255.255.255 port 67 interval 8 (xid=0x4c41d823)
Что делает journalctl гибкой командой, так это то, что ее многочисленные опции фильтрации позволяют вам показать именно то, что вам нужно. Упражнение 3 показывает некоторые из наиболее интересных вариантов.
Упражнение 3
В этом упражнении вы узнаете, как работать с различными оциями journalctl.
1. Введите journalctl. Вы увидите содержимое журнала с момента последнего запуска сервера, начиная с начала журнала. Содержимое отображается в меньшем количестве, поэтому вы можете использовать, например, less для просмотра файла.
2. Введите q, чтобы выйти из пейджера. Теперь введите journalctl —no-pager. Эта опция показывает содержимое журнала без использования пейджера.
3. Введите journalctl -f. Эта опция открывает режим просмотра в реальном времени, который позволяет видеть новые сообщения в режиме реального времени.
4. Введите journalctl и дважды нажмите клавишу Tab. Будут показаны конкретные опции, которые можно использовать для фильтрации. Выполните, например, journalctl _UID=0.
5. Введите journalctl -n 20. Опция -n 20 отображает последние 20 строк журнала (так же, как tail -n 20).
6. Теперь введите journalctl -p err. Эта команда показывает только ошибки.
7. Если вы хотите просмотреть сообщения журнала, записанные за определенный период времени, вы можете использовать команды —since и —until. Оба варианта принимают параметр времени в формате ГГГГ-ММ-ДД чч:мм:сс. Кроме того, вы можете использовать yesterday, today и tomorrow в качестве опций. Итак, введите journalctl —since yesterday, чтобы показать все сообщения, которые были написаны со вчерашнего дня.
8. journalctl позволяет комбинировать различные варианты. Итак, если вы хотите показать все сообщения с приоритом err, которые были написаны со вчерашнего дня, то используйте journalctl —since yesterday -p err.
9. Если вам нужно как можно больше подробностей, используйте journalctl -o verbose.
В предыдущем упражнении вы ввели journalctl -o verbose, чтобы показать подробный вывод.
В листинге 5 приведен пример подробного вывода. Вы можете увидеть, что вывод предоставляет подробную информацию для всех элементов, которые были логированы, в том числе PID, идентификатор связанный с учетной записью пользователя и группы и многое другое.
Листинг 5
[root@kvm ~]# journalctl -o verbose
-- Logs begin at Tue 2019-10-29 13:15:14 +10, end at Sun 2019-11-03 14:04:03 +10. --
Tue 2019-10-29 13:15:14.573354 +10 [s=4ef8b4f72a8f4b768f2ca65565a59ecc;i=1;b=eb2dcb353f4744b9933a2aa62af0ba23;m=104d0a;t=596040660742a;
PRIORITY=6
_TRANSPORT=driver
MESSAGE=Runtime journal is using 8.0M (max allowed 2.3G, trying to leave 3.5G free of 23.5G available → current limit 2.3G).
MESSAGE_ID=ec387f577b844b8fa948f33cad9a75e6
_PID=184
_UID=0
_GID=0
_COMM=systemd-journal
_EXE=/usr/lib/systemd/systemd-journald
_CMDLINE=/usr/lib/systemd/systemd-journald
_CAP_EFFECTIVE=5402800cf
_SYSTEMD_CGROUP=/system.slice/systemd-journald.service
_SYSTEMD_UNIT=systemd-journald.service
_SYSTEMD_SLICE=system.slice
_BOOT_ID=eb2dcb353f4744b9933a2aa62af0ba23
_MACHINE_ID=ee210f72c9ee465a83798398ca1e01f0
_HOSTNAME=kvm
Tue 2019-10-29 13:15:14.573478 +10 [s=4ef8b4f72a8f4b768f2ca65565a59ecc;i=2;b=eb2dcb353f4744b9933a2aa62af0ba23;m=104d85;t=59604066074a6;
PRIORITY=6
_BOOT_ID=eb2dcb353f4744b9933a2aa62af0ba23
_MACHINE_ID=ee210f72c9ee465a83798398ca1e01f0
_HOSTNAME=kvm
_SOURCE_MONOTONIC_TIMESTAMP=0
_TRANSPORT=kernel
SYSLOG_FACILITY=0
SYSLOG_IDENTIFIER=kernel
MESSAGE=microcode: microcode updated early to revision 0x1d, date = 2018-05-11
Tue 2019-10-29 13:15:14.573513 +10 [s=4ef8b4f72a8f4b768f2ca65565a59ecc;i=3;b=eb2dcb353f4744b9933a2aa62af0ba23;m=104da8;t=59604066074c9;
PRIORITY=6
_BOOT_ID=eb2dcb353f4744b9933a2aa62af0ba23
_MACHINE_ID=ee210f72c9ee465a83798398ca1e01f0
_HOSTNAME=kvm
_SOURCE_MONOTONIC_TIMESTAMP=0
_TRANSPORT=kernel
SYSLOG_FACILITY=0
Сохранение журнала systemd
По умолчанию журнал хранится в файле /run/log/journal. Весь каталог /run используется только для информации о текущем состоянии процесса, что означает, что журнал очищается при перезагрузке системы. Чтобы сделать журнал постоянным между перезагрузками системы, вы должны убедиться, что существует каталог /var/log/journal.
Даже если журнал записывается в постоянный файл в /var/log/journal, это не означает, что журнал сохраняется вечно. Журнал имеет встроенную ротацию логов, которая будет использоваться ежемесячно. Кроме того, максимальный размер журнала ограничен 10% размера файловой системы, и он также прекратит расти, если менее 15% файловой системы все еще свободно. Если это произойдет, самые старые сообщения из журнала автоматически удаляются, чтобы освободить место для новых сообщений. Чтобы изменить эти настройки, вы можете изменить файл /etc/systemd/journald.conf. Вы увидите, что в этом файле также можно установить некоторые другие параметры (Листинг 6).
Листинг 6
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=login
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
Сделать журнал постоянным не сложно. Упражнение 4 показывает, как это сделать.
Упражнение 4
В этом упражнении вы узнаете, как сделать журнал journald постоянным.
1. Войдите под root и введите mkdir /var/log/journal.
2. Прежде чем journald сможет записать журнал в этот каталог, вы должны установить владельца. Введите chown root:systemd-journal /var/log/journal, а затем chmod 2755 /var/log/journal.
3. Затем вы можете либо перезагрузить систему (недостаточно перезапустить службу systemd-journald), либо воспользоваться командой killall -USR1 systemd-journald.
4. Журнал systemd теперь сохраняется при перезагрузках. Если вы хотите просмотреть сообщения журнала с момента последней перезагрузки, используйте journalctl -b.
Рекомендую прочитать «Логи в Linux часть 2. Расширенные функции логов».
systemd – это системный менеджер по умолчанию в большинстве основных дистрибутивов Linux, который поставляется с новым демоном ведения журнала под названием «journald».
В течение многих лет системные логи и журналы ядра в традиционной системе SysVinit обрабатывались syslogd, который хранит логи в простых текстовых файлах, тогда как journald хранит логи в двоичном формате.
systemd собирает логи из нескольких источников, таких как система, ядро и различные службы или демоны, и предоставляет решение для централизованного управления через journald.
Это очень оптимизированный процесс, и логи можно просматривать в зависимости от требований, тогда как журналы syslogd анализируются вручную с помощью различных команд, таких как find, grep, cut и т. д.
В этой статье мы продемонстрируем, как просматривать и анализировать системные логи Linux с помощью команды journalctl.
Содержание
- Что такое journald?
- Что такое journalctl?
- 1) Как сделать логи постоянным в вашей системе?
- 2) Понимание полезных флагов journalctl
- 3) Как использовать journalctl для чтения логов
- Просмотр основного журнала с помощью команды journalctl
- Отображение логов в обратном порядке
- Отображение только “N” последних строк
- Проверка логов в реальном времени
- Фильтрация определенного лога загрузки
- Фильтрация на основе временного интервала
- Фильтрация по приоритету
- 4) Фильтрация по полям
- Фильтрация по системному юниту
- Фильтрация логов по UID, GID и PID
- Фильтр по пути к файлу
- Фильтр по пути к устройству
- Проверка использования диска
- Заключение
Что такое journald?
journald – это демон из systemd, который собирает логи из различных источников, таких как система, ядро и службы, и сохраняет их в двоичном формате для упрощения манипуляций.
Все эти события журналирования обрабатываются демоном journald, который обеспечивает централизованный способ обработки журналов независимо от того, откуда исходят сообщения.
Что такое journalctl?
journalctl – это инструмент командной строки, используемый для просмотра логов, которые собирает демон journald в systemd.
Логи хорошо проиндексированы и структурированы таким образом, что позволяет системным администраторам легко анализировать их и управлять ими на основе различных параметров, таких как фильтрация логов по времени, последовательности загрузки, конкретной службе, серьезности и т. д.
1) Как сделать логи постоянным в вашей системе?
По умолчанию логи включены в большинстве дистрибутивов Linux, но данные журнала хранятся в папке «/run/log/journal/», которая по умолчанию стирается при перезагрузке.
Чтобы сделать их постоянными, выполните следующие действия, которые автоматически создадут для вас каталог «/var/log/journal/».
Обратите внимание: каталог «/var/log/journal/» должен существовать с правильным владельцем и правами, чтобы служба systemd-journald могла хранить свои данные.
От пользователя root откройте файл «/etc/systemd/journald.conf» и раскомментируйте строку, содержащую «Storage = auto», и измените ее на «Storage = persistent».
В качестве альтернативы вы можете использовать команду sed для замены соответствующей строки в файле.
$ sudo sed -i '/Storage/ cStorage=persistent' /etc/systemd/journald.conf
После внесения изменений вы можете подтвердить их вступление в силу, выполнив следующую команду:
- -f: показывает только самые последние логи и сообщения журнала в реальном времени.
- -e: перейти в конец журнала, чтобы показать последние события.
- -r: вывести сообщения логов в обратном хронологическом порядке.
- -k: показать только сообщения ядра.
- -u: показать только сообщения для указанного модуля systemd.
- -b: показать сообщения о конкретной загрузке и отображает текущие загрузочные сообщения, если определенные загрузочные сеансы не включены.
- –List-boots: показывает сеансы загрузки в таблице, включая их идентификаторы и временные метки первого и последнего сообщения, относящегося к загрузке.
- –Utc: выразить время в формате всемирного координированного времени (UTC).
- -p, –priority =: фильтровать вывод по приоритетам сообщений.
- -S, –since =: фильтровать журналы по времени начала.
- -U, –until =: фильтровать журналы по времени окончания.
- –Disk-usage: показывает текущее использование диска всеми файлами логов.
3) Как использовать journalctl для чтения логов
Вы можете фильтровать логи в соответствии с вашими потребностями с помощью различных параметров и полей.
Мы покажем вам, как их использовать.
Просмотр основного журнала с помощью команды journalctl
Как вы заметили, в приведенном выше выводе логи показаны в хронологическом порядке.
Чтобы сначала отобразить последние логи, запустите команду journalctl с параметром «-r».
sudo journalctl -n 20 -- Logs begin at Fri 2021-02-12 14:26:01 +0630, end at Fri 2021-03-19 13:24:41 +0630. -- Mar 19 12:01:01 DevSexOps run-parts(/etc/cron.hourly)[27459]: finished 0anacron Mar 19 12:01:01 DevSexOps systemd[1]: Removed slice User Slice of root. Mar 19 13:00:01 DevSexOps systemd[1]: Starting Docker Cleanup... Mar 19 13:00:01 DevSexOps systemd[1]: Started Docker Cleanup. Mar 19 13:01:01 DevSexOps systemd[1]: Created slice User Slice of root. Mar 19 13:01:01 DevSexOps systemd[1]: Started Session 881 of user root. Mar 19 13:01:01 DevSexOps CROND[30364]: (root) CMD (run-parts /etc/cron.hourly) Mar 19 13:01:01 DevSexOps run-parts(/etc/cron.hourly)[30367]: starting 0anacron Mar 19 13:01:01 DevSexOps run-parts(/etc/cron.hourly)[30373]: finished 0anacron Mar 19 13:01:01 DevSexOps systemd[1]: Removed slice User Slice of root. Mar 19 13:05:46 DevSexOps sshd[30600]: Accepted password for root from 10.2.67.11 port 64283 ssh2 Mar 19 13:05:46 DevSexOps systemd[1]: Created slice User Slice of root. Mar 19 13:05:46 DevSexOps systemd-logind[752]: New session 882 of user root. Mar 19 13:05:46 DevSexOps systemd[1]: Started Session 882 of user root. Mar 19 13:05:46 DevSexOps sshd[30600]: pam_unix(sshd:session): session opened for user root by (uid=0) Mar 19 13:05:56 DevSexOps sudo[30634]: root : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/journalctl Mar 19 13:05:56 DevSexOps sudo[30634]: pam_unix(sudo:session): session opened for user root by root(uid=0) Mar 19 13:24:39 DevSexOps sudo[30634]: pam_unix(sudo:session): session closed for user root Mar 19 13:24:41 DevSexOps sudo[31542]: root : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/journalctl -n 20 Mar 19 13:24:41 DevSexOps sudo[31542]: pam_unix(sudo:session): session opened for user root by root(uid=0)
Проверка логов в реальном времени
Логи в реальном времени можно просмотреть с помощью опции «-f», используя команду «journalctl», как показано ниже.
Это может быть полезно при устранении неполадок.
Фильтрация определенного лога загрузки
journalctl --list-boots 0 7ff1965b851448b3996046d8cefa4805 Fri 2021-02-12 14:26:01 +0630—Fri 2021-03-19 13:24:41 +0630
Журналы загрузки имеют префикс, начинающийся с нуля. «0» относится к текущей загрузке.
Сеанс загрузки «-1» – это последний загруженный сеанс и так далее.
Чтобы просмотреть сообщения из конкретной загрузки, выполните следующую команду.
Покажем все сообщения из текущей загрузки:
sudo journalctl -b -- Logs begin at Fri 2021-02-12 14:26:01 +0630, end at Fri 2021-03-19 13:29:11 +0630. -- Feb 12 14:26:01 DevSexOps systemd-journal[97]: Runtime journal is using 8.0M (max allowed 189.4M, trying to leave 284.2M free of 1.8G available Feb 12 14:26:01 DevSexOps kernel: Initializing cgroup subsys cpuset Feb 12 14:26:01 DevSexOps kernel: Initializing cgroup subsys cpu Feb 12 14:26:01 DevSexOps kernel: Initializing cgroup subsys cpuacct Feb 12 14:26:01 DevSexOps kernel: Linux version 3.10.0-1160.15.2.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Re Feb 12 14:26:01 DevSexOps kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.15.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto Feb 12 14:26:01 DevSexOps kernel: Disabled fast string operations Feb 12 14:26:01 DevSexOps kernel: e820: BIOS-provided physical RAM map: Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009f3ff] usable Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x000000000009f400-0x000000000009ffff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000bfedffff] usable Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000bfee0000-0x00000000bfefefff] ACPI data Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000bfeff000-0x00000000bfefffff] ACPI NVS Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000bff00000-0x00000000bfffffff] usable Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved Feb 12 14:26:01 DevSexOps kernel: BIOS-e820: [mem 0x0000000100000000-0x000000013fffffff] usable Feb 12 14:26:01 DevSexOps kernel: NX (Execute Disable) protection: active Feb 12 14:26:01 DevSexOps kernel: SMBIOS 2.7 present. Feb 12 14:26:01 DevSexOps kernel: DMI: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 12/12/2018 Feb 12 14:26:01 DevSexOps kernel: Hypervisor detected: VMware Feb 12 14:26:01 DevSexOps kernel: vmware: TSC freq read from hypervisor : 2194.843 MHz Feb 12 14:26:01 DevSexOps kernel: vmware: Host bus clock speed read from hypervisor : 66000000 Hz Feb 12 14:26:01 DevSexOps kernel: vmware: using sched offset of 7157487822 ns Feb 12 14:26:01 DevSexOps kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved Feb 12 14:26:01 DevSexOps kernel: e820: remove [mem 0x000a0000-0x000fffff] usable Feb 12 14:26:01 DevSexOps kernel: e820: last_pfn = 0x140000 max_arch_pfn = 0x400000000 Feb 12 14:26:01 DevSexOps kernel: MTRR default type: uncachable Feb 12 14:26:01 DevSexOps kernel: MTRR fixed ranges enabled: Feb 12 14:26:01 DevSexOps kernel: 00000-9FFFF write-back Feb 12 14:26:01 DevSexOps kernel: A0000-BFFFF uncachable Feb 12 14:26:01 DevSexOps kernel: C0000-CFFFF write-protect Feb 12 14:26:01 DevSexOps kernel: D0000-EFFFF uncachable Feb 12 14:26:01 DevSexOps kernel: F0000-FFFFF write-protect Feb 12 14:26:01 DevSexOps kernel: MTRR variable ranges enabled:
Чтобы проверить вывод сообщений предыдущего сеанса загрузки, выполните следующую команду:
Журналы журнала можно фильтровать по временному интервалу.
С фильтром времени можно использовать несколько аргументов, как показано ниже.
Чтобы использовать фильтр времени, используйте ключи командной строки ‘-S или –since’ и ‘-U или –until’.
Чтобы отфильтровать журналы со вчерашнего дня, выполните следующую команду:
$ sudo journalctl -S yesterday
Приоритет | Код |
---|---|
0 | emerg |
1 | alert |
2 | crit |
3 | err |
4 | warning |
5 | notice |
6 | info |
7 | debug |
$ sudo journalctl -p 3 -b или $ sudo journalctl -p err -b Feb 12 14:26:02 DevSexOps kernel: sd 2:0:0:0: [sda] Assuming drive cache: write through Feb 12 14:26:04 DevSexOps kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled! Feb 15 13:39:25 DevSexOps sudo[11546]: pam_unix(sudo-i:auth): conversation failed Feb 15 13:39:25 DevSexOps sudo[11546]: pam_unix(sudo-i:auth): auth could not identify password for [user] Feb 15 13:39:27 DevSexOps sudo[11546]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/bash Feb 15 13:46:54 DevSexOps sudo[11586]: pam_unix(sudo-i:auth): conversation failed Feb 15 13:46:54 DevSexOps sudo[11586]: pam_unix(sudo-i:auth): auth could not identify password for [user] Feb 15 13:46:56 DevSexOps sudo[11591]: pam_unix(sudo:auth): conversation failed Feb 15 13:46:56 DevSexOps sudo[11591]: pam_unix(sudo:auth): auth could not identify password for [user] Feb 15 13:46:56 DevSexOps sudo[11586]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/bash Feb 15 13:46:59 DevSexOps sudo[11589]: pam_unix(sudo-i:auth): conversation failed Feb 15 13:46:59 DevSexOps sudo[11589]: pam_unix(sudo-i:auth): auth could not identify password for [user] Feb 15 13:46:59 DevSexOps sudo[11591]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/sh -c toilet -f bubble Feb 15 13:47:01 DevSexOps sudo[11589]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/bash Feb 15 14:17:19 DevSexOps sudo[11936]: pam_unix(sudo-i:auth): conversation failed Feb 15 14:17:19 DevSexOps sudo[11936]: pam_unix(sudo-i:auth): auth could not identify password for [user] Feb 15 14:17:21 DevSexOps sudo[11938]: pam_unix(sudo:auth): conversation failed Feb 15 14:17:21 DevSexOps sudo[11938]: pam_unix(sudo:auth): auth could not identify password for [user] ....
4) Фильтрация по полям
Логи можно фильтровать по определенным полям.
Синтаксис поля для сопоставления – «FIELD_NAME = MATCHED_VALUE», например «SYSTEMD_UNIT = httpd.service».
Кроме того, вы можете указать несколько совпадений в одном запросе для более удобной фильтрации.
Фильтрация по системному юниту
Чтобы показать логи, созданные указанной службой, используйте приведенные ниже команды.
Аналогичным образом вы можете фильтровать любые служебные сообщения.
Чтобы проверить доступные журналы служб, введите «journalctl -u» и дважды нажмите клавишу TAB.
$ sudo journalctl -u httpd.service или $ sudo journalctl _SYSTEMD_UNIT=httpd.service
Чтобы показать логи, созданные определенным идентификатором процесса, выполните следующую команду:
$ sudo journalctl _PID=1039
Если вы столкнулись с проблемами в работе сервера, первое, что нужно сделать — посмотреть логи Linux. В системный журнал записываются диагностические сообщения, поступающие от различных компонентов операционной системы, таких как ядро или службы, поэтому с большой долей вероятности причина сбоев будет найдена.
Каждое сообщение генерируется в результате возникновения какого-либо события в операционной системе. Событием может быть остановка службы, авторизации пользователя в системе или неполадки в работе приложения. События имеют определенный приоритет, в зависимости от степени критичности. В Linux различают следующие типы событий:
- emerg — авария, наивысший приоритет;
- alert — тревога;
- crit — критическое событие;
- err — ошибка;
- warn — внимание;
- notice — уведомление;
- info — информационное сообщение;
- debug — отладочная информация;
На сегодняшний день в Linux основными службами сбора логов являются rsyslog и systemd-journald, они работают независимо друг от друга и входят в состав большинства современных дистрибутивов.
rsyslog
Журналы службы находятся в директории “/var/log/” в виде обычных текстовых файлов. В зависимости от типа события, сообщения записываются в разные файлы. Например файл “/var/log/auth.log” содержит информацию о входе пользователей в систему, а в файл “/var/log/kern.log” записываются сообщения ядра. В разных дистрибутивах названия файлов могут отличаться, поэтому для точного понимания куда именно происходит запись сообщений рассмотрим файл конфигурации “/etc/rsyslog.d/50-default.conf”.
Правила описывают место хранения логов в зависимости от типа сообщения. В левой части строки указан тип сообщения в формате “[Источник].[Приоритет]”, а в правой части имя файла журнала. При записи типа сообщения можно применять символ “*”, обозначающий любое значение или параметр “none”, обозначающий исключение из списка. Рассмотрим более подробно первые два правила.
“auth,authpriv.* /var/log/auth.log”
“*.*;auth,authpriv.none -/var/log/syslog”
Первое правило означает, что все сообщения принятые от механизма авторизации будут записаны в файл “/var/log/auth.log”. В этом файле будут зарегистрированы все попытки входа пользователей в систему, как удачные так и не удачные. Второе правило говорит о том, что все сообщения, кроме тех, которые связаны с авторизацией будут записаны в файл “/var/log/syslog”. Именно к этим файлам приходится обращаться наиболее часто. Следующие правила определяют место хранения журналов ядра “kern.*” и почтовой службы “mail.*”
Журналы логов можно открыть любой утилитой для просмотра текста, например less, cat, tail. Откроем файл “/var/log/auth.log”
less /var/log/auth.log
Каждая строка файла является отдельным сообщением, поступившим от приложения или службы. Все сообщения, независимо от источника имеют единый формат и состоят из пяти частей. Рассмотрим их на примере выделенного сообщения на скриншоте.
- Дата и время регистрации сообщения — “Feb 12 06:18:33”
- Имя компьютера, с которого пришло сообщение — “vds”
- Имя программы или службы, к которой относится сообщение — “sshd”
- Идентификатор процесса, отправившего сообщение — [653]
- Текст сообщения — “Accepted password for mihail from 188.19.42.165 port 2849 ssh2”
Это был пример успешного подключения по ssh.
А так выглядит неудачная попытка:
В этом файле также фиксируется выполнение команд с повышенными правами.
Откроем файл /var/log/syslog
На скриншоте выделено сообщение о выключении сетевого интерфейса.
Для поиска нужной информации в больших текстовых файлах можно использовать утилиту grep. Найдем все сообщения от службы pptpd в файле “/var/log/syslog”
grep 'pptpd' /var/log/syslog
Во время диагностики можно использовать утилиту tail, которая выводит последние строки в файле. Команда “tail -f /var/log/syslog” позволит наблюдать запись логов в реальном времени.
Служба rsyslog является очень гибкой, высокопроизводительной и может использоваться для сбора логов как на локальных системах, так и на уровне предприятия. Полную документацию можно найти на официальном сайте https://www.rsyslog.com/
Запись логов происходит непрерывно и размер файлов постоянно растет. Механизм ротации обеспечивает автоматическое архивирование старых журналов и создание новых. В зависимости от правил, обработка журналов может выполняться ежедневно, еженедельно, ежемесячно или при достижении файлом определенного размера. По мере создания новых архивов, старые могут быть просто удалены или предварительно отправлены по электронной почте. Ротация выполняется утилитой logrotate. Основная конфигурация находится в файле “/etc/logrotate.conf”, также обрабатывается содержимое файлов в директории “/etc/logrotate.d/”
Новые правила можно записывать в основной файл конфигурации, но более правильным будет создание отдельного файла в директории “/etc/logrotate.d/” По умолчанию в директории уже содержится несколько файлов.
Рассмотрим файл “/etc/logrotate.d/rsyslog”, который содержит правила ротации для журналов службы rsyslog.
В начале правила указывается путь к файлу журнала, затем в фигурных скобках перечисляются директивы.
- rotate 7 — необходимо постоянно хранить 7 файлов
- daily — ежедневно будет создаваться новый файл
- compress — старые файлы необходимо архивировать.
На скриншоте видно, что в каталоге “/var/log/” находится основной журнал “syslog” и семь архивов, что соответствует правилам ротации.
Более подробное описание по настройке утилиты logrotate можно найти в мануале, выполнив команду “man logrotate”
journald
Служба сбора логов systemd-journald является частью системы инициализации systemd. Файлы журнал хранятся в директории “/var/log/journal/” в специальном формате и могут быть открыты с помощью утилиты journalctl. Формат записей такой же как у службы rsyslog.
Команда journalctl без параметров выводит на экран все записи, но учитывая, что объем журнала может достигать нескольких гигабайт, такой способ просмотра не подходит для практического применения. Рассмотрим некоторые опции утилиты.
- вывод записей с момента последней загрузки
journalctl -b
- вывод записей за определенный период времени
journalctl -S "2020-02-17 12:00" -U "2020-02-17 12:10"
- вывод записей, принятых от определенной службы
journalctl -u pptpd
- вывод сообщений ядра
journalctl -k
- вывод сообщений с определенным приоритетом, в данном случае будут выведены ошибки и более высокие приоритеты(crit, alert, emerg).
journalctl -p err
- вывод сообщений в реальном времени
journalctl -f
Для более гибкого поиска опции можно совмещать. Выведем все ошибки службы pptpd
journalctl -u pptpd -p err
Если в качестве аргумента указать путь к исполняемому файлу, утилита выведет все сообщения, отправленные этим файлом. Выведем сообщения, отправленные файлом “/usr/bin/sudo” начиная с 04:15 18-го февраля 2020 года. Фактически будут выведены все команды, выполненные с повышенными правами.
journalctl -S "2020-02-18 04:15" /usr/bin/sudo
Для того, чтобы узнать сколько места на диске занимают файлы журнала, выполним команду
journalctl --disk-usage
Для ограничения объема журнала размером 1Gb выполним команду
journalctl --vacuum-size=1G
Открытие бинарных файлов
В заключении рассмотрим несколько специальных файлов в директории “/var/log/”, в которых регистрируются попытки входа пользователей в систему. Это бинарные файлы, которые могут быть открыты только специальными утилитами.
/var/log/wtmp — содержит информацию об успешном входе пользователей в систему, для открытия используется утилита last
/var/log/btmp — в файле регистрируются все неудачные попытки входа в систему, открывается командой lastb с повышенными правами. Параметр -n определяет количество выводимых строк начиная с конца файла.
/var/log/lastlog — содержит время последнего входа для каждой учетной записи, может быть открыт одноименной утилитой lastlog