Exchange Server Study (2-3). Mail Flow - Message Tracking
이전 포스팅
2022.01.15 - [Exchange] - Exchange Server Study (2-2). Mail Flow - Connector - Outbound
이전에도 메시지 추적(Message Tracking)에 대해서 다룬 적이 있습니다. 복습 차원에서 다시 한번 작성하였습니다.
Protocol Log 보다는 Message Tracking이 현실적으로 쉽고 도움되는 경우가 많다고 생각합니다.
아래의 기술자료를 기준으로 Self Study를 진행하였습니다.
Message tracking | Microsoft Docs
Configure message tracking | Microsoft Docs
Search message tracking logs | Microsoft Docs
Structure of the message tracking log files
로그의 기본 위치는 다음과 같습니다.
%ExchangeInstallPath%TransportRoles\Logs\MessageTracking
다만 Mail Flow - Connector 포스팅을 참고하여 로그 위치를 일괄적으로 변경하셨다면, 아래와 같이 변경되었을 것입니다.
Connector Log 포스팅을 읽었다면 modertated transport를 제외한 나머지 서비스가 의미하는 바가 쉽게 다가 올 것이라 생각합니다.
예를 들면, 제 테스트 환경의 Exchange 3대중 1번서버는 MSGTRK~ 로그만 확인됩니다.
3번서버에서는 MD, MS로 끝나는 로그들도 확인됩니다.
Connector Study를 진행할 때, 수발신을 진행한 Mailbox가 3번 서버에서 활성화 되어 있었기 때문입니다.
<Inbound 테스트 시나리오>
<Outbound 테스트 시나리오>
각 파일들을 열어보면 몇가지 내용을 지우면 CSV와 동일하게 필터링할 수 있는 구조로 되어 있습니다.
각 파일들을 열어보면 몇가지 내용을 지우면 CSV와 동일하게 필터링할 수 있는 구조로 되어 있습니다.
그리고 순환 로깅(Circular logging)이 켜져 있을 경우, 아래의 조건에 해당하면 오래된 파일부터 제거한다고 나와 있습니다. 아래의 내용은 기억해야 합니다.
1. Maximum age에 도달하였을 때
2. Maximum size에 도달하였을 때
Fields, Event types, Source values in the message tracking log files
기술 자료상에서 해당 내용들은 자세히 설명되어 있습니다. 각 항목들을 이해하려면 다양한 케이스를 경험해야 합니다. 이번 포스팅에서는 아래의 내용들은 다루지 않습니다.
<Field name>
<Event name>
<Source value>
아래의 자료에서는 Message Tracking Log 를 Set-TransportService 명령어를 통해서 변경하는 방법에 대해서 다루고 있습니다.
Configure message tracking | Microsoft Docs
아래의 자료는 Get-MessageTrackingLog 에 대한 기본 명령어가 설명되어 있습니다.
Search message tracking logs | Microsoft Docs
Get-MessageTrackingLog 는 각 TrackingLog 폴더에 있는 로그를 조건에 맞게 검색을 도와줍니다.
우선 Get-MessageTrackingLog 만 입력하면, Exchange Management Shell 을 연결한 기본 로그들이 추출됩니다.
모든 서버의 Message Tracking Log를 추출하려면 다음과 같은 형태로 명령어를 입력합니다.
Get-TransportService|Get-MessageTrackingLog
Get-TransportService|Get-MessageTrackingLog -Resultsize Unlimited|Export-Csv -Path C:\csv\Logtest.csv -Encoding UTF8
첫째줄만 제거한 뒤, Excel 로 Open 합니다.
명령어를 통해서 모든 항목이 출력되는 것 같지만 아래와 같이 일부 항목이 올바르게 표시되지 않습니다.
그래서 저같은 경우에는 다음 명령어 구조로 내보내기를 진행합니다.
Get-TransportService | Get-MessageTrackinglog -ResultSize Unlimited |Select-Object Timestamp,ClientIp,ClientHostname,ServerIp,ServerHostname,SourceContext,ConnectorId,Source,EventId,InternalMessageId,MessageId,NetworkMessageId,@{Name="Recipients";Expression={$_.recipients}},@{Name="RecipientStatus";Expression={$_.recipientstatus}},TotalBytes,RecipientCount,RelatedRecipientAddress,@{Name="Reference";Expression={$_.Reference}},MessageSubject,Sender,ReturnPath,Directionality,TenantId,OriginalClientIp,MessageInfo,MessageLatency,MessageLatencyType,@{Name="EventData";Expression={$_.EventData}},TransportTrafficType | export-csv c:\csv\logtest2.csv -Encoding UTF8 |
이전 명령어로 표시 못했던 영역이 올바르게 표시되는 것을 확인할 수 있습니다.
실제 운영하는 서버에서는 로그 용량이 상당하기 때문에 전체 기록을 조회하기는 어렵습니다.
그래서 필요한 정보를 중심으로 추출하는 것을 권장드립니다.
Sender 와 Recipient 지정하는 형태
Get-TransportService | Get-MessageTrackinglog -Sender limcmfz@hotmail.co.kr -Recipients onprem-1@contoso.kr -ResultSize Unlimited |Select-Object Timestamp,ClientIp,ClientHostname,ServerIp,ServerHostname,SourceContext,ConnectorId,Source,EventId,InternalMessageId,MessageId,NetworkMessageId,@{Name="Recipients";Expression={$_.recipients}},@{Name="RecipientStatus";Expression={$_.recipientstatus}},TotalBytes,RecipientCount,RelatedRecipientAddress,@{Name="Reference";Expression={$_.Reference}},MessageSubject,Sender,ReturnPath,Directionality,TenantId,OriginalClientIp,MessageInfo,MessageLatency,MessageLatencyType,@{Name="EventData";Expression={$_.EventData}},TransportTrafficType | export-csv c:\csv\logtest3.csv -Encoding UTF8 |
위의 추출된 내용중 Connector-Inbound에서 다뤘던 수신된 메일을 확인해 보겠습니다.
먼저 제목으로 필터링합니다.
그리고 Timestamp를 오름차순으로 정렬합니다.
같은 건에 대해서 Message ID와 NetworkMessage ID는 전부 동일합니다. 하지만 Internal Message ID는 다를 수 있습니다.
InternalId=71481140707329 로 HAREDIRECT 동작이 이루어지고 이후에 새로운 Internal ID와 관련된 HARECEIVE, HADISCARD가 확인되는 것을 알 수 있습니다.
HA로 시작하는 이벤트는 shadow message 및 DAG와 관련된 부분으로 기회가 되면 나중에 자세히 다루도록 하겠습니다.
지금 단계에서는 메시지의 복사본을 만약을 대비해서 생성하고 버리는 과정이 진행되었다고 이해해도 무방할 것 같습니다.
Connector ID를 보면 Transport Service 구간만 나타나는 것으로 확인됩니다