systemd

Master journalctl понимает системные журналы

Master journalctl понимает системные журналы
Systemd - новый инструмент для управления сервисами. Первоначально созданный Red Hat, он позволяет лучше управлять службами с помощью централизованного процесса, который отслеживает и запускает службы по мере необходимости. Но systemd также включает в себя контейнерную систему, систему cron, способ безопасного предоставления временных каталогов службам, а также систему ведения журналов - вот на чем мы сосредоточимся здесь.

Понимание журналов важно: если вы когда-нибудь попадете на сервер с ошибкой или взломанный, как правило, единственный способ понять, что произошло, - это журналы. Основное приложение, которое мы собираемся использовать, - journalctl, отсюда и название статьи. Так что слушайте внимательно, так как в подходящий день вы можете быть счастливы узнать, как это работает.

Где хранятся логи systemd? И в каком формате он хранится?

Мы примем предположение, что у вас нормальная система, потому что systemd можно настроить так, чтобы она находилась в исключительных местах. Кроме того, некоторые дистрибутивы Linux, такие как Ubuntu 16.04 отключил постоянное ведение журнала по умолчанию, что мешает systemd правильно выполнять свою работу. Если у вас есть такой дистрибутив, отредактируйте / etc / systemd / journald.conf, измените Storage = auto на Storage = persistent и, наконец, перезагрузите.

Таким образом, вы обычно найдете файлы журналов systemd в / var / log / journal. Журнальная система сама по себе является услугой, называемой system-journald.услуга.  Попробуем перечислить файлы в этом каталоге:

# лс / вар / журнал / журнал / -R
/ var / log / journal /:
15e43c1734090ac7fbea6b40fcd99d31
 
/ var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31:
система @ a39da368947bd2ba-231f9bfc18a7a356.журнал ~
система @ 62ac1299826d036cb043d6c06a9493b7-0000000000000001-00067d6410099a19.журнал
пользователь-1000 @ b27e98812223a9bc-387e0521703f73d9.журнал ~
пользователь-1000 @ 2123bc076b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.журнал
пользователь-1000.журнал
[много других файлов, подобных приведенным выше…]

Поскольку я хочу, чтобы вы продолжали читать, мне пришлось сократить вывод, поскольку он содержит много файлов (в моем примере более 60 файлов), извините за это! Соблазн открыть, может быть,?

# head --bytes = 512 / var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31 / [электронная почта защищена]
b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.журнал
?s, q?n / FLz???Ulz?л?]????
?_?б???z????о?y1KN ?я?eO??W?ты?  ?знак равно?x0?L?d?7??X4n #?е? d3l?
п??o | MFO:?!qs?.tK??р?\??1?| 5  ????$?грамм??#?S??;??B7???????т???Y????мН?q????ZQ
?Yv?е?????BD?C?? wF??d |
?2?? 7???????[??ООН?= 8????c?2 = p?&?"   ?0
????*????_??  ???
5?????yk?грамм? ?6?|??ты??ш: # 12?Y??
3 ТУ;???'?jX??2?Икс'?знак равно??[[электронная почта защищена]
[электронная почта защищена]?_?>??3S???,lR?.?$?грамм?L???s?/ E??M1??q???

Эй, видите, это не совсем похоже на обычные файлы журналов, которые вы видите правильно? Не волнуйтесь, этот файл не поврежден, вы только что обнаружили аспект systemd: systemd хранит файлы в двоичном формате. Вот почему он как можно меньше: структурированные данные, такие как время или местоположение, хранятся прямо в двоичном формате, который обычно занимает меньше байтов, чем текст. Но это не единственная причина.

systemd не только хранит строки журнала. Его цель - упростить мониторинг и исследование журналов. Чтобы помочь в этой задаче, сообщения журнала - это фактически строка текста, сопровождаемая такими данными, как серьезность журнала (предупреждение, ошибка и т. Д.).) или даже поля, которые были бы полезны только для вашего приложения (например, запрашиваемый URL).

# journalctl --output = verbose --all
ПРИОРИТЕТ = 6
_UID = 0
_GID = 0
_CAP_EFFECTIVE = 3fffffffff
_BOOT_ID = ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID = bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME = Linux
SYSLOG_FACILITY = 3
SYSLOG_IDENTIFIER = systemd
БЛОК = dnf-makecache.услуга
_TRANSPORT = журнал
_PID = 1
_COMM = systemd
_EXE = / usr / библиотека / systemd / systemd
_CMDLINE = / usr / lib / systemd / systemd --switched-root --system --deserialize 76
_SYSTEMD_CGROUP = / инициализация.сфера
_SYSTEMD_UNIT = инициализация.сфера
_SYSTEMD_SLICE =-.ломтик
_SELINUX_CONTEXT = system_u: system_r: init_t: s0
CODE_FILE = источник / ядро ​​/ задание.c
CODE_LINE = 795
CODE_FUNCTION = job_log_status_message
MESSAGE_ID = a76e08846f5f0971371dbb11126e62e1
СООБЩЕНИЕ = Запущен dnf makecache.
# journalctl --catalog --lines = 3000 --pager-end "_TRANSPORT = kernel" РЕЗУЛЬТАТ = готово
_SOURCE_REALTIME_TIMESTAMP = 1532886335471422

Я сказал вам, что есть много полей (здесь 25 полей или 29 подсчетов временных меток), весь приведенный выше фрагмент предназначен только для одного сообщения журнала! Большим преимуществом является то, что вы можете запустить поиск, отфильтровав любое поле в этом сообщении журнала. Это действительно позволяет вам использовать расширенную фильтрацию.

Один из наиболее очевидных фильтров, который вам может понадобиться, - это фильтрация по сервису. Как вы можете видеть выше, есть поле UNIT, поэтому вы можете легко отфильтровать сообщения журнала только от одной службы. Я расскажу тебе об этом позже.

Но этот объем данных означает еще кое-что: почти во всех случаях вы никогда не откроете файл журнала вручную и никогда не коснетесь папки / var / log / journal. Вы будете использовать journalctl для любой задачи, связанной с ведением журнала. Нет такой ротации журнала, все управляется временем сообщения журнала.

Также количество полей будет зависеть от того, насколько хороша интеграция systemd в вашем приложении. Чем больше полей содержит сообщение журнала, тем оно лучше. Для базовых системных сервисов systemd уже позаботился о хорошей интеграции, но для других приложений и сервисов качество интеграции сильно различается. Обычно это должно улучшаться со временем, когда люди привыкают к systemd.

Хорошо, теперь пришло время познакомиться с функциями journalctl.

Наиболее часто используемые команды для journalctl

Первая команда, на которую вы, возможно, захотите взглянуть, - это та, которая показывает журналы ядра Linux. Да, systemd также обрабатывает хранилище журналов ядра, поэтому вы также можете получить журналы предыдущих загрузок. Вот команда:

# journalctl --catalog --lines = 3000 --pager-end "_TRANSPORT = kernel"

Он показывает вам пейджер, на котором вы можете увидеть последние сообщения. Вы можете прокручивать до последних 3000 строк с помощью клавиш со стрелками (↑ / ↓) или Page Up / Page Down. Флаг -catalog инструктирует journalctl показывать контекст вокруг строк журнала, что очень похоже на перезагрузку компьютера или, в других контекстах, остановку / запуск службы. Я всегда устанавливаю этот флаг, поскольку контекст всегда имеет значение, он помогает узнать, в какой ситуации появилась строка журнала, чтобы вы могли догадаться, почему у вас эта строка журнала.

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

# journalctl --catalog --lines = 35000 --pager-end --boot "_TRANSPORT = kernel"

Обратите внимание, что аргумент командной строки -boot работает во всех ситуациях, а не только с журналами ядра. Если вы предпочитаете начинать с самого начала:

# journalctl --catalog --boot "_TRANSPORT = kernel"

Не знаю, так ли это у вас, но логов ядра у меня достаточно! А как насчет общего обзора вашей машины??

# journalctl --catalog --lines = 3000 --pager-end

Вау, в вашей системе много чего происходит! Здесь была бы полезна небольшая фильтрация. Один из наиболее часто используемых фильтров соответствует определенной службе (например, вашему SSH-серверу или HTTP-серверу), имя файла модуля systemd для службы SSH - sshd.сервис, так что:

# journalctl --catalog --lines = 3000 --pager-end --unit = sshd.услуга

Это круто, не правда ли? Что ж, его можно использовать, только если вы знаете название службы, но во многих случаях вы не знаете название этой службы. Если вы оказались в такой ситуации, вам может потребоваться список услуг, их описания и их статус:

# systemctl list-units --type = service

Хорошо, теперь эта проблема решена. Но иногда у вас появляется сообщение об ошибке, которое вы получаете от внешней системы, такой как ваш собственный веб-сайт, или от приложения на вашем рабочем столе. Таким образом, вы, вероятно, захотите найти определенное слово или предложение в сообщении журнала. Начиная с systemd v237, теперь это возможно.

В journalctl поиск нечувствителен к регистру, если слово, которое вы ищете, написано строчными буквами. Таким образом, если вы будете искать слово порт, он также будет искать слово порт с заглавными буквами. Пример:

# journalctl --catalog --lines = 3000 --pager-end --grep = "порт"

Теперь, если вы выполните поиск такого слова, как CPU, он будет искать только CPU со всеми заглавными буквами, он не будет искать процессор.

# journalctl --catalog --lines = 3000 --pager-end --grep = "CPU"

Вы помните сообщение об ошибке от внешней системы? Как правило, эти сообщения содержат отметку времени. Чтобы отфильтровать сообщение журнала, вы можете использовать эту метку времени. journalctl может перечислить все сообщения журнала с определенной даты и времени с аргументом -since:

# journalctl --catalog --since = "2018-07-30 09:30:00"

Если эта внешняя система является удаленной или использует метки времени в формате UTC, вам нужно будет выполнить фильтрацию на основе даты и времени в формате UTC и отобразить в терминале метки времени в формате UTC, поэтому вам не нужно преобразовывать их в голове, что, как правило, действительно сбивает с толку. Для этого вам нужно добавить UTC после строки времени в аргументе -since. Затем вам нужно будет добавить флаг -utc. Так, например:

# journalctl --catalog --since = "2018-07-30 10:45:00 UTC" --utc

Обратите внимание, что вы можете использовать только флаг -utc, в этом случае он будет в основном отображать все даты и время в часовом поясе UTC.

# journalctl --catalog --lines = 3000 --pager-end --utc

Журналами лучше управлять с помощью journalctl

Как видно из всех предыдущих команд, ведение журнала systemd упрощает фильтрацию и, следовательно, отладку, поскольку вы можете выбирать все строки журнала с помощью одной команды journalctl. Некоторые из вас, вероятно, знали древние времена, когда вам приходилось вручную открывать каждый файл в / var / log, чтобы иметь общее представление о проблеме и о том, что произошло. Со всеми советами, которые вы узнали здесь, вы будете владеть надежными инструментами, чтобы просматривать сообщения журнала так, как ВЫ этого хотите.

5 лучших аркад для Linux
В настоящее время компьютеры - это серьезные машины, используемые для игр. Если вы не можете получить новый рекорд, вы поймете, о чем я. В этом посте ...
Битва за Веснот 1.13.6 Выпущена разработка
Битва за Веснот 1.13.6, выпущенная в прошлом месяце, является шестой разработкой в ​​1.13.x и содержит ряд улучшений, в первую очередь пользовательско...
Как установить League Of Legends на Ubuntu 14.04
Если вы поклонник League of Legends, то это возможность для вас протестировать League of Legends. Обратите внимание, что LOL поддерживается в PlayOnLi...