+7(8422)78-70-65

Exchange Server хранение логов в MySQL

01 декабря 2024 г.
Exchange Server хранение логов в MySQL

    Как известно Exchange Server хранит свои транспортные логи ограниченное количество по времени, из-за того что их периодически надо чистить.

    Скрипт написан на PowerShell + подключена библиотека MySQL.

    #подключение библиотеки MySql.Data.dll
    [void][system.reflection.Assembly]::LoadFrom("C:\Distr\MySQL\MySql.Data.dll")
    $date=get-Date -date (Get-Date).AddDays(-1) -uformat "%d-%m-%Y"
    $filename = "ExchangeLogParseMySQLULGVP-" + $date + ".txt"
    $mysql_server = "IP-MySQL-Server"
    $mysql_user = "USERNAME"
    $mysql_password = "PASSWORD"
    $dbName = "Exchange-Servers"
    $Connection = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection
    $Connection.ConnectionString = "SERVER=$mysql_server;DATABASE=$dbName;UID=$mysql_user;PWD=$mysql_password;charset=utf8mb4"
    $Connection.Open()
    $sql = New-Object MySql.Data.MySqlClient.MySqlCommand
    $sql.Connection = $Connection
    $startDateFormatted = get-Date -date (Get-Date).AddDays(-1).ToShortDateString() -uformat "%m/%d/%Y 00:00:01"
    $endDateFormatted = get-Date -date (Get-Date).AddDays(-1).ToShortDateString() -uformat "%m/%d/%Y 23:59:59"
    $lists = Get-TransportService | Get-MessageTrackingLog -Start "$startDateFormatted" -End "$endDateFormatted" -ResultSize Unlimited | Select @{Label='Timestamp';Expression={$_.timestamp.ToString("yyyy-MM-dd HH:mm:ss")}}, Sender, Recipients, MessageSubject, MessageId, TotalBytes, OriginalClientIp, EventId | Sort-Object -Property Timestamp 
    try
    {
    #формируем список
    foreach ($search in $lists) {
    $Timestamp = $search.Timestamp;
    $Sender = $search.Sender;
    $Recipients = $search.Recipients -replace "'", '';
    $Subject = $search.MessageSubject -replace "'", '';
    $SubjectFormat = "`"{0}`"" -f$Subject;
    $Message = $search.MessageID;
    $Total = $search.TotalBytes;
    $ClientIp = $search.OriginalClientIp;
    $Id = $search.EventId;
    #записываем информацию в табдицу БД
    $sql.CommandText = "INSERT INTO `TABLE NAME` (Timestamp,Sender,Recipients,MessageSubject,MessageId,TotalBytes,OriginalClientIp,EventId) VALUES ('$Timestamp','$Sender','$Recipients','$SubjectFormat','$Message','$Total','$ClientIp','$Id')"
    $sql.ExecuteNonQuery() | Out-Null
    }
    }
    catch
    {
     $_.Exception.Message | Out-File "D:\LogParse\$filename"
    }
    #Закрытие подключения
    $Connection.Close()
    

    Дамп БД выкладывать смысла не вижу по коду и так понятна структура таблиц.

    Скрипт успешно проверен на Exchange Server 2016 и Exchange Server 2019.

    Если вдруг у Вас возникнут сложности с настройкой резервного копирования, Вы всегда можете обратиться ко мне за консультацией.


    Благодарность за статью 100 рублей.