Как стать автором
Обновить
45.96
Ринго MDM
Ринго — отечественный MDM для устройств Apple

Логирование на Mac и команда log: руководство для администраторов Apple

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров1.5K
Автор оригинала: Mike Boylan
Этот материал не дословный, а свободный перевод с дополнениями от команды Ринго. Мы актуализировали команды для свежих версий macOS и добавили примеры, чтобы сделать руководство более полезным для администраторов Apple.
Этот материал не дословный, а свободный перевод с дополнениями от команды Ринго. Мы актуализировали команды для свежих версий macOS и добавили примеры, чтобы сделать руководство более полезным для администраторов Apple.

Как администратор 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 также содержит ценную информацию. На основе примера выше, если вы хотите отфильтровать логи, которые:

  1. Связаны с процессом mdmclient;

  2. Используют подсистему com.apple.ManagedClientи категорию OSUpdate;

  3. Содержат строку 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.

Теги:
Хабы:
Всего голосов 3: ↑3 и ↓0+4
Комментарии0

Публикации

Информация

Сайт
ringomdm.ru
Дата регистрации
Численность
31–50 человек
Местоположение
Россия
Представитель
Ильдар Бигашев