Помимо непосредственного анализа транспортных логов, отслеживание сообщений в Exchange 2013 очень легко проводить с помощью инструмента Message Tracking Logs.
В этой статье я постараюсь коротко рассказать о некоторых возможностях командлета Get-MessageTrackingLog 1, созданного специально для обработки журналов отслеживания сообщений.
Найти больше информации по настройке и администрированию Exchange 2013 на моем блоге вы сможете в основной статье тематики – Exchange 2013 — Установка, настройка, администрирование.
Отслеживание сообщений в Exchange 2013
Итак, командлет можно выполнять без дополнительных параметров:
1 |
Get-MessageTrackingLog |
Данные будут взяты с сервера, на котором выполняется команда. По умолчанию будут выведены все события движения сообщений (но не более 1000 – ограничение командлета) за последние 30 дней.
Вывод не очень удобный и это ещё мягко говоря:
Снять установленное ограничение в 1000 строк можно ключом -ResultSize, выставив значение Unlimited (будьте аккуратны, это может сильно нагрузить сервер). Если все же есть стойкое желание продолжать просматривать огромное множество сообщений, вы можете немного упростить себе жизнь, скормив вывод командлету Out-Host 2 (сокращенно oh), который выводит результат не сплошным потоком, а постранично (в зависимости от размера консоли):
1 |
Get-MessageTrackingLog | Out-Host -Paging |
Ключ -Paging как раз отвечает за постраничный вывод данных.
Уже удобнее, но данные все равно выглядят абсолютно неинформативно.
На самом деле в журналах отслеживания сообщений хранится достаточно много информации и некоторая её часть может быть чрезвычайно полезна при анализе работы сервера, анализе движения сообщений и многих других задач. Увидеть сами лог-файлы вы можете в каталоге %ExchangeInstallPath%TransportRoles\Logs\MessageTracking. Надо признать факт ,что ни один нормальный человек не будет анализировать эти логи вручную и сейчас вы поймете почему:
Это наглядный пример представления информации в журнале отслеживания сообщений. Непонятно абсолютно ничего. Более того, не получится даже нормально соотнести названия столбцов (на рисунке выделено синим) с соответствующими им значениями в каждой строке. Вообще говоря, можно открыть в Excel как формат CSV 3, поменять разделители, изменить представление на табличное, отсортировать по колонкам, а потом понять, что нужных вам данных тут нет и их надо искать в другом файле…
В принципе можно смело закрывать документ и идти снова в консоль.
Если вы хотите вывести значения только определенных столбцов, то вы столкнетесь с трудностями. Дело в том, что имена столбцов 4 в файле и имена этих же столбцов в Powershell отличаются! Разработчики в Microsoft не ищут легких путей, надо отдать им должное. Как же тогда нам узнать какие вообще поля можно вытащить и какие имена они будут иметь? Ответ прост – нам как всегда поможет командлет Format-List 5 (сокращенно fl). Напомню – он выводит свойства каждого объекта в отдельной строке.
А теперь представьте – нужно вывести каждое свойство каждого объекта в новой строке и таких объектов будет 1000 штук. Вариант не очень удобный. В принципе можно задать более жесткие условия отбора для Get-MessageTrackingLog, но, вероятнее всего, он все равно отобразит несколько объектов. Придется обратиться к командлету Select-Object 6 (сокращенно select). Грубо говоря, он позволяет выполнять сравнимые с sql-оператором Select задачи. Нам этот командлет нужен, чтобы просто вывести любое первое сообщение. Команда будет выглядеть следующим образом:
1 |
Get-MessageTrackingLog | Select-Object -First 1 | Format-List |
На рисунке отмечены имена свойств каждого объекта:
Ну а теперь можно свободно оперировать полученными данными и выводить только то, что нам нужно. Например я хочу посмотреть через какие соединители проходит сообщение (сузим круг поиска, указав тему письма), когда я отправляю его изнутри организации внутреннему же получателю. Для этого воспользуемся свойством ConnectorID. Также не помешает вывести результат в читаемом формате и тут поможет командлет Format-Table 7 8 (сокращенно ft). Выровняем ширину столбцов ключом –AutoSize:
1 |
Get-MessageTrackingLog -MessageSubject "test_153504072016" | Format-Table Timestamp,ConnectorID,EventID,Source -AutoSize |
А вот и вывод команды:
Все просто и понятно и видны даже названия соединителей, в том числе и системных.
Ну и напоследок попробуем обработать вывод Get-MessageTrackingLog с помощью очень интересного командлета Group-Object 9 (сокращенно group). Он позволяет сгруппировать объекты по какому-либо свойству и подсчитать их количество. Надо отметить, что командлет обычно используется в последнюю очередь (или одним из последних), поскольку он создает в конвейере новые объекты и далее уже не получится обработать объекты командлета Get-MessageTrackingLog.
Попробуем подсчитать количество всех сообщений, которые приняли пользователи нашей организации. Для этого нужно ввести дополнительное условие, которое будет отфильтровывать ненужных получателей вне домена. Сделать это можно с помощью Where-Object 10 (сокращенно where):
1 |
Get-MessageTrackingLog -EventId "Receive" -ResultSize Unlimited | Where-Object {$_.Recipients -like "*@*.bissquit.com"} | Group-Object Recipients | Sort-Object Count -Descending | Format-Table Count,Name -AutoSize |
Что-то много получилось разных обработок, но попробую объяснить все по порядку:
- Where-Object {$_.Recipients -like “*@*.bissquit.com”} – фильтрует вывод по адресу получателя, чтобы он совпадал с одним из доменов организации (у меня использются обслуживаемые домены bissquit.com, corp.bissquit.com, tech.bissquit.com);
- Group-Object Recipients – идет группировка по адресу получателя;
- Sort-Object Count -Descending – сортируем объекты по количеству полученных писем в порядке убывания;
- Format-Table Count,Name -AutoSize – отображаем только нужные нам поля, определяя размер столбцов автоматически.
На самом деле не так уж и сложно. Вот что я увидел в результатах:
Что-то не очень наглядно, одни служебные почтовые ящики. Но, к сожалению, на тестовой инфраструктуре у меня не особо много пользователей. Вот в продакшене команда отрабатывает на отлично. Не советую конечно ставить ключ -ResultSize Unlimited без указания даты начала. Установить дату можно таким образом – -Start (Get-Date).AddDays(-1). Конструкция вернет текущую метку времени и вычтет из неё один день. То есть у вас будет возвращена статистика по получателям внутри организации за последние сутки.
Если интересно получение статистики с помощью Get-MessageTrackingLog по каким-либо другим критериям отбора, пишите в комментариях, попробуем разобраться вместе.