
Как администратор IT-инфраструктуры вы наверняка не раз сталкивались с необходимостью проверять логи для диагностики проблем. Логи — это своего рода "история" системы, которая помогает не только устранять неполадки, но и понимать, почему система ведет себя тем или иным образом.
Мы рассмотрим основы унифицированной системы логирования Apple. Расскажем, как читать логи с помощью команды log
, и приведем примеры фильтрации сообщений, чтобы вы могли находить именно те данные, которые вам нужны.
Что такое унифицированное логирование?
Когда унифицированное логирование было впервые представлено на WWDC 2016, это стало значительным шагом вперед. До этого логи на платформах Apple записывались с использованием стандартных Unix-систем логирования, обычно в виде простых текстовых файлов на диске.
Однако по мере усложнения платформ Apple объем генерируемых логов также увеличился. Унифицированное логирование было представлено как "логирование будущего". Оно создавалось с целью объединить все системы логирования на платформах Apple и решить следующие задачи:
Единый и эффективный механизм для записи логов как в пользовательском режиме (user mode), так и в режиме ядра (kernel mode);
Максимальный сбор информации при минимальном влиянии на производительность (например, сжатие данных и управление жизненным циклом логов);
Постоянное логирование — сбор данных должен работать практически всегда;
Встроенная защита конфиденциальности.
Многие администраторы до сих пор ищут логи в традиционных Unix-файлах в /var/log/
. Действительно, некоторые логи до сих пор записываются туда. Например, файл /var/log/install.log
содержит полезную информацию о процессе установки macOS, и его легко анализировать с помощью командной строки.
Но такие файлы часто не дают полной картины, и сообщения из них обычно дублируются в унифицированной системе логирования. Чтобы получить полное представление о происходящем в системе, рекомендуется использовать команду log
для работы с унифицированными логами.
Скрытый текст
Также стоит упомянуть приложение Console.app, которое находится по пути /Applications/Utilities. Хотя мы в этой статье и не будем подробно останавливаться на нем, оно все же может быть полезно для просмотра логов через графический интерфейс. Тем не менее команда log
гораздо более гибкая и практичная.
Apple Configurator 2, который можно загрузить из Mac App Store, также может быть полезен для потоковой передачи логов от подключенных iOS-устройств. Также для этих целей можно использовать Xcode.
Команда log
Команда log
встроена в macOS, а ее исполняемый файл находится по пути /usr/bin/log
. Для получения полной информации о ее использовании введите man log
в Терминале (Terminal.app), чтобы открыть руководство. В этом разделе мы рассмотрим основы, чтобы вы могли с чего-то начать.
Допустим, вы хотите увидеть все логи уровня "default" за последнюю минуту, исключая информационные и отладочные сообщения (логи уровня “debug”). Для этого выполните команду:
sudo log show --last 1m
Вы, скорее всего, удивитесь количеству сообщений, которые появятся на экране всего за минуту. Это связано с целью Apple вести логирование как можно более активно. Позже мы объясним, как фильтровать сообщения, а пока рассмотрим основные параметры команды log
.
В примере выше мы использовали log show
. Эта команда просто отображает логи системы. Мы ограничили время с помощью параметра --last 1m
, где m означает "минута". Вы можете использовать другие временные интервалы, например, последний час --last 1h
или последний день --last 1d
. С помощью параметров --start
и --end
и указания временных меток в форматах YYYY-MM-DD, YYYY-MM-DD HH:MM:SS или YYYY-MM-DD HH:MM:SSZZZZZ вы можете точно фильтровать сообщения по времени.
Команда log show
отображает логи того компьютера Mac, где она выполняется. Вы также можете использовать параметр --archive
для работы с архивами логов, созданными с помощью команды log collect
. Последняя команда полезна для сбора логов с любой системы (вашей или другой) для последующего анализа. Архивы можно хранить, перемещать и анализировать в любое время.
Инструмент sysdiagnose
, который автоматически запускается при отправке отчета об ошибках в Apple, также создает архив логов для анализа инженерами Apple (файл system_logs.logarchive
в корне папки sysdiagnose
). Подробнее о команде collect
можно узнать в ее руководстве (man log).
Чтобы увидеть, как эти инструменты работают вместе, рассмотрим пример сбора всех логов уровня "default" за последние 20 минут:
sudo log collect --output ~/Desktop/system_logs.logarchive --last 20m
Это создаст архив логов на вашем рабочем столе с именем system_logs.logarchive
. Чтобы просмотреть логи из архива, выполните:
sudo log show --archive ~/Desktop/system_logs.logarchive
Если log show
полезен для анализа прошлых событий, то log stream
отображает логи в реальном времени. Это может быть полезно для наблюдения за системой во время возникновения проблемы или выполнения определенных действий.
Например, чтобы увидеть все логи уровня "default" в реальном времени, используйте команду:
sudo log stream
Чтобы отменить команду, нажмите Ctrl+C
. Однако потоковый вывод всех логов не всегда практичен из-за большого объема данных. Фильтрация логов как при использовании log show
, так и log stream
может быть выполнена с помощью предикатов.
Фильтрация с помощью предикатов
Стремление Apple вести максимально полное логирование полезно для администраторов, так как больше данных дает больше возможностей для решения проблем. Однако это и усложняет поиск нужной информации в потоке сообщений. Здесь на помощь приходит фильтрация с помощью предикатов.
Apple предоставляет подробное руководство по фильтрации предикатов на своем сайте, и эта тема также освещена в руководстве по команде log
. Вот пример для начала:
sudo log stream --debug --predicate 'subsystem=="com.apple.sharing" and category=="AirDrop"'
Обратите внимание на параметр --predicate
. Он позволяет фильтровать сообщения по заданным критериям. В этом примере мы ищем логи, связанные с подсистемой com.apple.sharing
и категорией AirDrop
. Это полезный фильтр для анализа логов, связанных с AirDrop.
Apple определяет подсистемы как "основные функциональные области" приложения или операционной системы, а категории — как "области внутри подсистемы". Если вы только начинаете работать с фильтрацией логов, может быть сложно определить, какие критерии использовать. Например, как мы узнали, что AirDrop использует именно эту подсистему и категорию?
Производители программного обеспечения могут предоставить вам соответствующие фильтры для анализа логов, генерируемых их продуктами.
Еще один способ определить распространенные подсистемы и категории — просто изучить вывод команд log stream
и log show
. Рассмотрим пример записи лога:
mdmclient: [com.apple.ManagedClient:OSUpdate] [0:MDMDaemon:OSUpdate:<0x891ff5>] MDM requested: {
InstallAction = Default;
ProductKey = "MSU_UPDATE_24D60_patch_15.3_minor";
}
В этом случае:
Подсистема (subsystem): com.apple.ManagedClient
Категория (category): OSUpdate
Процесс (process): mdmclient
Фильтрация по процессу — это еще одна полезная возможность при использовании предикатов.
Само сообщение лога eventMessage
также содержит ценную информацию. На основе примера выше, если вы хотите отфильтровать логи, которые:
Связаны с процессом
mdmclient
;Используют подсистему
com.apple.ManagedClient
и категориюOSUpdate
;Содержат строку
MSU_UPDATE_24D60_patch_15.3_minor
в сообщении;вы можете использовать следующий фильтр:
process=="mdmclient" and subsystem=="com.apple.ManagedClient" and category=="OSUpdate" and eventMessage contains "MSU_UPDATE_24D60_patch_15.3_minor"
Такой предикат выведет логи, показывающие статус обновления macOS до версии 15.3, инициированного через MDM-систему. Обратите внимание, что мы использовали оператор contains
. Другие варианты сравнения строк включают:
beginswith
(начинается с);endswith
(заканчивается на);matches
(соответствует шаблону).
По умолчанию сравнение строк в предикатах чувствительно к регистру и диакритическим знакам.
Ниже приведен список некоторых полезных процессов, подсистем и категорий, которые могут пригодиться администраторам Apple. Обратите внимание, что это не исчерпывающий список, и Apple может изменять их по своему усмотрению.
Описание | Параметры фильтра |
AirDrop | подсистема: com.apple.sharing категория: AirDrop |
Apple Push Notification Service (APNs) | процесс: apsd подсистема: com.apple.apsd |
Apple Watch Unlock | подсистема: com.apple.sharing категория: AutoUnlock |
Content caching | подсистема: com.apple.AssetCache |
Gatekeeper | процесс: syspolicyd подсистема: com.apple.syspolicy.exec |
macOS Installer and Software Update | процесс: softwareupdated подсистемы: com.apple.mac.install, com.apple.SoftwareUpdate, com.apple.SoftwareUpdateMacController, com.apple.mobileassetd |
MDM | процесс: mdmclient подсистема: com.apple.ManagedClient |
Mobile Activation (Activation Lock, DEP Enrollment, etc.) | процесс: mobileactivationd подсистема: com.apple.MobileActivation |
Networking | подсистема: com.apple.network категории: connection, boringssl |
OCSP (Certificate validity) | подсистема: com.apple.securityd категория: ocsp |
Open Directory | процесс: opendirectoryd подсистемы: com.apple.opendirectoryd, com.apple.AccountPolicy |
User login | процесс: loginwindow подсистема: com.apple.login |
XProtect | подсистема: com.apple.xprotect |
Конфиденциальные данные
При анализе логов вы можете столкнуться с записями, содержащими строку <private>
, иногда сопровождаемую уникальным идентификатором (UUID). Это означает, что система попыталась записать данные, которые могут идентифицировать пользователя, сеть или другую динамическую информацию, считающуюся конфиденциальной. По умолчанию такие записи маскируются унифицированной системой логирования, что соответствует принципу Apple: конфиденциальность является одной из ключевых основ этой системы.
Рассмотрим пример из Open Directory. Этот лог указывает на успешное событие аутентификации. В данном случае при разблокировке настроек в свойствах папки в Finder, с помощью Touch ID:
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:auth] Verifier state for E8AE8B8E-D0B9-4381-8A77-E0BFD3FDD810 console domain: success
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:policy] AccountPolicy: Authentication allowed
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:auth] Authentication allowed by SecureToken and account policy for <private>
По умолчанию имя пользователя маскируется как <private>
. Однако в некоторых случаях, например, при диагностике проблем, может быть полезно раскрыть данные, которые обычно скрываются. Это можно сделать с помощью конфигурационного профиля, который может быть доставлен через MDM-решение, либо для конкретных подсистем, либо для всей системы в целом.
Скрытый текст
Пример такого профиля представлен ниже:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>System Logging</string>
<key>PayloadIdentifier</key>
<string>com.apple.system.logging.16C0D11E-A151-45F5-AD2D-16A33CE4766A</string>
<key>PayloadType</key>
<string>com.apple.system.logging</string>
<key>PayloadUUID</key>
<string>16C0D11E-A151-45F5-AD2D-16A33CE4766A</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>System</key>
<dict>
<key>Enable-Private-Data</key>
<true/>
</dict>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>Allow Private Data in System Logging</string>
<key>PayloadIdentifier</key>
<string>ringo.43B9B7DE-1BBA-4DF2-BBF0-DF5E8F9BC853</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>43B9B7DE-1BBA-4DF2-BBF0-DF5E8F9BC853</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
Вот тот же лог, но с включенным логированием конфиденциальных данных для подсистемы com.apple.opendirectoryd
с использованием профиля Open Directory:
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:auth] Verifier state for E8AE8B8E-D0B9-4381-8A77-E0BFD3FDD810 console domain: success
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:policy] AccountPolicy: Authentication allowed
opendirectoryd: (PlistFile) [com.apple.opendirectoryd:auth] Authentication allowed by SecureToken and account policy for support
Обратите внимание, что в этот раз имя пользователя support
было выведено в открытом виде.
Рекомендуется включать логирование конфиденциальных данных только для конкретных подсистем и только в случае крайней необходимости. Чтобы снова скрыть такие данные, достаточно удалить конфигурационный профиль.
Команда log
и фильтрация предикатов открывают широкие возможности для просмотра, потоковой передачи, сбора и фильтрации логов, чтобы находить именно ту информацию, которая вам нужна.
Команды, описанные выше, — это лишь малая часть того, что может сделать команда log
для анализа происходящего в системе. Чем больше времени вы уделяете изучению логов, тем лучше начинаете понимать их принцип работы, что упрощает поиск аномалий. Чем глубже вы погружаетесь в логи, тем полезнее они становятся для диагностики проблем и понимания того, как и почему происходят те или иные события в системе. Это делает команду log
незаменимым инструментом для любого администратора Apple.