How to export and filter All Available MailboxDiagnosticLogs


Exchange offer us access to Mailbox Diagnostic Logs so in case of issues we know what happened with many components. The cmdlet is available both in Exchange and Exchange Online but some parameter's values might differ. Here I'll focus only on Exchange Online.

You can find official documentation about Export-MailboxDiagnosticLogs on TechNet.

I noticed that many administrators don't know which are the Component Names for which they can export mailbox diagnostic logs (the documentation is not always updated).

Currently the diagnostic logs for following components are available:
- AttendeeListReplicationAssistant
- InternetCalendar
- CalendarSharingLocalFolder
- ActionProcessingAgent
- FreeBusyPublishingAssistantQuickLog
- SharingMigrationAssistant
- ClearCalendar
- OOFRules
- DefaultViewIndexer
- MRM
- DelegateRulesManagement
- BirthdayAssistant
- MeetingMessageProcessingAgent
- RemindersAssistant
- MFN
- Calendar
- CalendarPermissions
- SharingPermissionManagement
- SharingSyncAssistant
- HoldTracking

Also, when exporting ExtendedProperties the result is an XML that is hard to digest.

For this reasons I've created a script who will check every time which are the available components for which you can get logs and you can also choose what you want to export (either one component or all).

You can also view & sort the ExtendedProperties with their values and this data will be exported as well.

The script allow you to see the results in the Console & GridView but also exports MailboxDiagnosticLogs for the selected component (or for all) and all extended properties.

Script Requirements:
- to be a Global Admin
- to have at least PowerShell version 3 installed (you can use "Get-Host" to check it)

How to run the script:
1. run Get-MailboxDiagnosticLogs.ps1
2. provide Global Admin credentials
3. Provide PATH where the outputs will be exported
4. Provide the mailbox for which the MailboxDiagnosticLogs will be shown and exported

You can download the script from the following location:TechNet Gallery


#region Disclaimer
Write-Host "
Note: Before you run the script:

The sample scripts are not supported under any Microsoft standard support program or service. The sample scripts are provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility of such damages.
" -ForegroundColor Red
#endregion

#region Current values for Component Names

#endregion

#region Connect to Exchange Online
Write-Host "`nPlease input your credential in the logging window!" -ForegroundColor Green
$LiveCred = Get-Credential

$Error.Clear()
$previousErrorActionPreference = $global:ErrorActionPreference
$global:ErrorActionPreference = 'Stop'
Try {
$O365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $O365Session -AllowClobber
}
Catch {
Try {
$proxysettings = New-PSSessionOption -ProxyAccessType IEConfig
$O365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $LiveCred -Authentication Basic -AllowRedirection -SessionOption $proxysettings
Import-PSSession $O365Session -AllowClobber
}
Catch{
Write-Host "`nWe couldn't connect with or without proxy to Exchange Online! Press [Enter] to exit" -ForegroundColor Red
Read-Host
$global:ErrorActionPreference = $previousErrorActionPreference
Exit
}
}
$global:ErrorActionPreference = $previousErrorActionPreference

# removing limit of showing only 4 values for one property (only in current session)
$FormatEnumerationLimit = -1
# get a timestamp
$Ts= get-date -Format yyyyMMdd_HHmmss

Write-Host "`nPlease input the path were the files will be saved" -ForegroundColor Green
$ExportPath = Read-Host

if ($ExportPath[-1] -eq "\") {
$ExportPath = $ExportPath.Substring(0,$ExportPath.Length-1)
}

If (Test-Path -Path $ExportPath) {
#Write-Host "`nThe path exist!" -ForegroundColor Green
}
else {
Write-Host "`nThe output folder doesn't exist or is not valid! Please create or use an existing one and re-run the script. Press [Enter] to exit" -ForegroundColor Red
Read-Host
Exit
}

#endregion

#region MbxDiagLogs

Write-Host "`nPlease input the mailbox for which you want to see MailboxDiagnosticLogs: " -ForegroundColor Green
$mbx = Read-Host

# Check if mailbox exist
$previousErrorActionPreference = $global:ErrorActionPreference
$global:ErrorActionPreference = 'Stop'
try{
Get-Mailbox $mbx | Out-Null
}
Catch{
Write-Host "`nThe mailbox $mbx doesn't exist. Press [Enter] to exit"
Read-Host
$ErrorActionPreference = $previousErrorActionPreference
Exit
}
$global:ErrorActionPreference = $previousErrorActionPreference

# Getting available components that can be exported
$previousErrorActionPreference = $global:ErrorActionPreference
$global:ErrorActionPreference = 'Stop'
Try {
Export-MailboxDiagnosticLogs $mbx -ComponentName TEST
}
Catch {
Write-Host "in catch"
$MbxDiagLogs = ((($error[0].Exception.Message -Split "Available logs: ")[1] -replace "'") -split ",") -replace " "
}

$global:ErrorActionPreference = $previousErrorActionPreference

Write-Host "`nPlease type (1) if you want the logs for Primary mailbox or (2) if you want to see the logs for the Archive? (for a different answer will show directly the Primary Mailbox)" -ForegroundColor Green
$answer = Read-Host
If ($answer -eq 2 ) {$ArchiveSwitch = $true}
else {
$ArchiveSwitch = $False
}

# Export-MailboxDiagnosticLogs with ComponentName
$option = ( $MbxDiagLogs + "ALL")|Out-GridView -PassThru -Title "Choose a specific ComponentName or the last one for ALL"
if ($option -ne "ALL") {
Write-Host "`nGetting $option logs" -ForegroundColor Yellow
Export-MailboxDiagnosticLogs $mbx -ComponentName $option -Archive:$ArchiveSwitch| Tee-Object $ExportPath\$($Ts)_$option.txt
}
else {
$MbxDiagLogs |%{
Write-Host "`nGetting $_ logs" -ForegroundColor Yellow
Export-MailboxDiagnosticLogs $mbx -ComponentName $_ -Archive:$ArchiveSwitch| Tee-Object $ExportPath\$($Ts)_$_.txt
}
}

# Export-MailboxDiagnosticLogs with ExtendedProperties
Write-Host "You can view & filter ExtendedProperties in the Grid View window." -ForegroundColor Yellow
$extendLogs = Export-MailboxDiagnosticLogs $mbx -ExtendedProperties
$ExtendedProps = [XML]$extendLogs.MailboxLog
$ExtendedProps.Properties.MailboxTable.Property | Select name,value | Out-GridView -Title "All ExtendedProperties with values (you can filter here to find what is interesting for you; e.g: use `"ELC`" for MRM properties)"
$ExtendedProps.Properties.MailboxTable.Property | Select name,value |Out-File $ExportPath\$($Ts)_ExtendedProperties.txt

Write-Host "`nOutput was exported in the following location: $ExportPath" -ForegroundColor Yellow

# Cleaning created PSSesion
Remove-PSSession $O365Session
#endregion

Comments (1)

  1. turbomcp says:

    Cool
    Thanks

Skip to main content