Maстер разбора отладки DNS: Руководство по PowerShell

Один из первых шагов, который следует предпринять при устранении проблемы подобного рода, – включить входную отладку DNS. Но когда вам приходится смотреть на созданный отладочный журнал, вы встретите неприятные сюрпризы. Упростите себе жизнь, создав сценарий разбора отладочного журнала DNS с помощью PowerShell!

Как создать разборщик отладочного журнала DNS с помощью PowerShell

У вас есть множество вариантов для отладки, но в моем случае мне нужна дополнительная информация о динамических обновлениях. Вот как выглядит моя конфигурация на одном из моих DNS-серверов.

DNS Debug Logging

Когда это включено, начнется создание файла журнала по указанному вами пути, который будет выглядеть примерно так:

DNS Debug Log

Первая строка отмеченных линий – это IP-адрес, а последняя строка – запись DNS, которую он пытался обновить. Они были отмечены по очевидным причинам. В зависимости от выбранных вами параметров этот файл журнала может стать огромным и не всегда удобен для чтения.

Что если я хочу отфильтровать только один IP-адрес или сузить диапазон по определенному временному интервалу? Вы не можете сделать это с помощью стандартного файла журнала. Вот почему я создал сценарий разбора отладочного журнала DNS с помощью PowerShell.

Приведенный ниже сценарий берет этот файл журнала и разбирает его в удобный файл CSV, который выглядит следующим образом:

PowerShellified DNS Debug Log

Это выглядит намного лучше, не правда ли? Скрипт просматривает файл журнала на наличие ошибок и извлекает дату, IP и ошибку, затем помещает их в красиво оформленный CSV. Также исключаются все IP-адреса DNS-серверов.

По какой-то причине, независимо от выбранного варианта, я обнаружил, что IP-адреса самих DNS-серверов все равно появляются. Мне просто нужно знать IP-адрес клиента, у которого возникают проблемы с обновлением его DNS-записи.


#requires -Module ActiveDirectory
$dnsServer = ## This is the server name as a NETBIOS or FQDN
$OutputFilePath = C:\DNSDebugLogSummary.csv ## The CSV file that will be created
## The log file you specified in the debug logging dialog box
$DnsDebugLogFilePath = \$dnsServer\c$\DnsDebugLog.log
## Find all of the DNS server IPs in the current domain
$DnsServerIPs = ((Get-ADDomain).ReplicaDirectoryServers | Resolve-DnsName).IPAddress
Write-Verbose Message Found DNS servers $($DnsServerIPs -join ,)
## Find all lines in the log file that don’t contain the strings ‘NOERROR’ or are blank. This
## retrieves only the lines with errors in them.
Select-String Pattern NOERROR|^\s* Path $DnsDebugLogFilePath -NotMatch | foreach {
try {
## Find lines containing an IP address
if ($_.Line -match \b(?:\d{1,3}\.){3}\d{1,3}\b) {
Write-Verbose Message Found line with IP address.
$IP = $Matches[0]
## If the IP isn’t a DNS server it must be a client IP
if ($DnsServerIPs -notcontains $IP) {
Write-Verbose Processing IP ‘$IP
$Split = $_.Line.Split( )
$Date = $Split[0]
$Time = $Split[1] + $Split[2]
$Err = [regex]::Match($_.Line, \[(.*)\]).Groups[1].Value
[pscustomobject]@{ Date = $Date $Time; IP = $IP; Error = $Err }
}
}
} catch {
Write-Warning $_.Exception.Message
}
} | Export-Csv Path $OutputFilePath Append NoTypeInformation

Source:
https://adamtheautomator.com/dns-debug-log-parser/