Очистка и перемещение логов в Exchange Server

Очистка и перемещение логов в Exchange Server

После развертывания Exchange вы можете заметить, что свободное место на дисках начинает очень быстро уменьшаться. Помимо роста самых почтовых баз данных, в Exchange очень много место съедают различные логи. Особенно сильно проблема большого размера логов актуальна для версий, начиная с Exchange 2013. Если не использовать механизмы очистки логов, очень часто бывают случаи, когда почтовые базы аварийно отмонтируются и почтовый сервис становится недоступным для пользователей (часто сопровождается ошибкой 4.3.1 Insufficient system resources) из-за того, что логи Exchange заняли все свободное место на диске. В этой статье мы рассмотрим несколько стратегий очистки (усечения) и перемещения лог файлов в Exchange Server 2013/2016/2019.

Транзакционные логи в Exchange

Транзакционные логи баз данных это важный элемент в Exchange Server. При отправке/получении любого письма Exchange сначала вносит информацию в транзакционный лог, и только потом сохраняет элемент непосредственно в базу данных. Транзакционные логи содержат все операции, которые выполняются с базой данных и крайне важны для ее восстановления. Размер одного лог файла 1 Мб. Таких файлов может быть очень много, их количество зависит от активности пользователей в базе данных.

Есть несколько способов очистки транзакционных логов:

  1. Выполняйте регулярное резервное копирование почтовых баз Exchange. При корректном резервном копировании, транзакционные логи, которые более не нужны для восстановления базы данных, автоматически очищаются. Используйте любое современное решение для резервного копирования Exchange (обязательно должно поддерживаться копирование через Volume Shadow Copy – VSC). Можно использовать даже встроенный Windows Server Backup (пример);
  2. Включите Circular Logging для транзакционных логов. В этом случае файл транзакции автоматически удаляется, после того как данные из него сохранены в базу данных. Вы можете включить Circular Logging из EAC (
    Enable Circular logging
    в свойствах базы) или PowerShell:
    Set-MailboxDatabase mbxDBname1 -CircularLoggingEnabled $true
    (для применения изменений нужно перемонтировать базу); exchange включить Circular logging для автоматической очистки трназакционных логов
  3. Переместите базу Exchange с транзакционными логами на новый диск большого размера. По умолчанию при установке Exchange первая почтовая база сохраняется в каталог C:Program FilesMicrosoftExchange Server… Желательно переместить почтовые базы с системного диска C: на другой. Для этого используется командлет Move-DatabasePath. Например, чтобы переместить базу и транзакционные логи на диск F:, выполните команду:
    Move-Databasepath mbxDBname1 –EdbFilepath “F:DBmbxDBname1mbxDBname1.edb” –LogFolderpath “F:DBmbxDBname1logs”
    Move-DatabasePath перенос базы exchange с транзакционными логами на другой диск

Логи базы данных очередей в Exchange 2013/2016/2019

В базе данных очередей Mail.que временно хранятся сообщения, ожидающие обработки. Все элементы в каждой очереди обрабатываются сервером транспорта в особом порядке. База данных очередей представляет собой обычную базу ESE. Очереди находятся только на mailbox или на edge transport серверах (тут зависит от версии Exchange, так как в 2013, 2016 и 2019 архитектура различается). Расположение базы данных очередей и ее транзакционных логов указывает в конфигурационном XML файле %ExchangeInstallPath%BinEdgeTransport.exe.config (QueueDatabasePath и QueueDatabaseLoggingPath). Если база очередей и ее транзакционные логи занимает очень много места, вы можете перенести ее из дефолтного каталога
%ExchangeInstallPath%TransportRolesdataQueue
на другой диск (вот здесь это описано довольно подробно https://docs.microsoft.com/en-us/exchange/change-the-location-of-the-queue-database-exchange-2013-help?redirectedfrom=MSDN)

Очистка транспортных логов Exchange

В транспортных логах Exchange хранится информацию о всех сообщениях обработанных службой MSExchangeTransport (по ссылке доступна статья о том как включить/отключить/переместить транспортные логи в Exchange — https://docs.microsoft.com/en-us/exchange/transport-logs-exchange-2013-help?redirectedfrom=MSDN).

Вы можете проверить включены ли транспортные логи на вашем сервере и пути к ним с помощью следующих команд PowerShell:

Get-TransportService -Identity meskexch1 | fl *logpath*
Get-TransportService -Identity meskexch1| fl *logenabled*

Get-TransportService - настройки логов и каталоги для хранения

Основные транспортные логи Microsoft Exchange Server по умолчанию хранятся в каталогах:

%ExchangeInstallPath%TransportRolesLogsHubConnectivity
%ExchangeInstallPath%TransportRolesLogsMessageTracking (используется при отслеживании писем через Get-MessageTrackingLog)
%ExchangeInstallPath%LoggingIRMLogs
%ExchangeInstallPath%TransportRolesLogsHubActiveUsersStats
%ExchangeInstallPath%TransportRolesLogsHubServerStats
%ExchangeInstallPath%TransportRolesLogsHubProtocolLogSmtpReceive
%ExchangeInstallPath%TransportRolesLogsHubRouting
%ExchangeInstallPath%TransportRolesLogsHubProtocolLogSmtpSend
%ExchangeInstallPath%TransportRolesLogsHubQueueViewer
%ExchangeInstallPath%TransportRolesLogsHubAgentLog

Можно изменить каталог для хранения SMTP логов отправки/получения (Protocollogs) через EAC: Servers -> servers -> выберите сервер -> Transport Logs -> Protocol log.

перенести траспортные лог иexchnage server на другой диск

Если нужно изменить каталог хранения логов отслеживания Message Tracking, измените значение в поле Message Tracking log path в EAC.

Также с помощью символических ссылок вы можете спокойно перенаправить любой из каталогов транспортных логов на другой диск или даже сетевую папку (по UNC пути). Чтобы создать символическую ссылку, используется встроенная утилита mklink:
mklink /d "D:ReceiveSMTPLogs" meskffs01exchangeHubReceiveSMTPLog

Останется только изменить путь к каталогу с логами с помощью командлета:

Set-TransportService meskexch1 –ReceiveProtocolLogPath “D:ReceiveSMTPLosg”

Таким образом вы можете хранить любые другие транспортные логи в сетевой папке на удаленном сервере.

Ротация и удаление IIS логов в Exchange

В логах IIS накапливается информация о подключениях к почтовым ящикам Exchange через OWA и ActiveSync. Со временем логи IIS, генерируемые пользователями при доступе к Exchange, могут занимать довольно много места.

Вы можете автоматически удалять старые логи IIS. Можно сделать автоматическое задание в планировщике Windows, которое запускается каждый день и удаляет логи IIS старше 30 дней:
set-location c:inetpublogsLogFilesW3SVC1
foreach ($File in get-childitem) {
if ($File.LastWriteTime -lt (Get-Date).AddDays(-30)) {
del $File
}
}

Осталось создать новое задание в планировщике, которое должно запускать ваш PS1 скрипт очистки логов.

Если вам нужны старые логи IIS для анализа и траблшутинга, вы можете перенести их на другой диск:

  1. Откройте консоль IIS Manager и выберите Default Web Site;
  2. Перейдите в секцию Logging;
  3. Измените путь к каталогу, в котором по умолчанию хранятся логи IIS (directory); изменить путь к логам IIS в Exchnage Server, очистить старые логи
  4. Сохраните изменения и перезапустите IIS. После этого IIS начнет писать логи в другой каталог.

Также можно изменить путь к логам IIS через PowerShell:

Import-Module WebAdministration
Set-ItemProperty ‘IIS:SitesDefault Web Site’ -name logfile.directory "F:IISLogs"

Очистка папки Logging в Exchange

Большое количество логов различных служб хранятся в каталоге Logging (например, в Exchange 2013 это C:Program FilesMicrosoftExchange ServerV15Logging). Со временем все эти логи начинают занимать довольно много места.

Особо стоит отметить логи диагностики и производительности в C:Program FilesMicrosoftExchange ServerV15LoggingDiagnostics (при включенной диагностике на высоком уровне они могут занимать десятки гигабайт).

Вы можете автоматически очищать старые логи Exchange в этих папках:
gci ‘C:Program FilesMicrosoftExchange ServerV15Logging’,’C:inetpublogs’ -Directory | gci -Include ‘*.log’,’*.blg’ -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-21) | Remove-Item
gci ‘C:Program FilesMicrosoftExchange ServerV15LoggingDiagnostics’ -Directory | gci -Include ‘*.log’,’*.blg’ -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-5) | Remove-Item

Можно добавить эти команды в задание Task Scheduler.

PowerShell скрипт очистки логов Exchange

Можно объединить все рассмотренные выше команды для очистки старых логов Exchange в один PowerShell скрипт, который нужно запускать по расписанию:

$days = 15
$dirs=@(
"C:inetpublogsLogFiles",
"C:Program FilesMicrosoftExchange ServerV15Logging",
"C:Program FilesMicrosoftExchange ServerV15BinSearchCeresDiagnosticsETLTraces",
"C:Program FilesMicrosoftExchange ServerV15BinSearchCeresDiagnosticsLogs",
"C:Program FilesMicrosoftExchange ServerV15TransportRolesLogs"
)
Get-ChildItem $dirs -Recurse -File | Where-Object { $_.Name -like "*.log" -or $_.Name -like "*.blg" -or $_.Name -like "*.etl" } | Where-Object LastWriteTime -lt (Get-Date).AddDays(-$days) | Remove-Item -ErrorAction "SilentlyContinue"

PowerShell
Очистка и перемещение логов в Exchange Server