Master DNS Debug Parsing: Um Guia PowerShell

Um dos primeiros passos que você deve tomar ao solucionar um problema como esse é habilitar o registro de log de DNS. Mas quando você é obrigado a examinar o log gerado pelo registro de log, pode ter uma surpresa desagradável. Facilite isso criando um script de análise de log de DNS com PowerShell!

Como Construir um Analisador de Log de DNS com PowerShell

Você tem várias opções para a depuração, mas no meu caso, preciso de mais informações sobre atualizações dinâmicas. É assim que está configurado em um dos meus servidores DNS.

DNS Debug Logging

Quando isso está habilitado, ele começa a criar um arquivo de log no caminho especificado, parecido com este:

DNS Debug Log

A primeira linha de linhas marcadas é o endereço IP, e a última linha é o registro DNS que tentou atualizar. Estas foram marcadas por razões óbvias. Dependendo das opções escolhidas, este arquivo de log pode se tornar enorme e não é no formato mais fácil de ler.

E se eu quiser filtrar apenas um único IP ou limitar por um determinado período? Você não pode fazer isso com o arquivo de log padrão. Por isso, criei um script de análise de log de DNS com PowerShell.

O script abaixo pega este arquivo de log e o analisa em um arquivo CSV organizado assim:

PowerShellified DNS Debug Log

Isso parece muito melhor, não é? O script analisa o arquivo de log em busca de erros e extrai a data, IP e o erro, colocando-os em um CSV formatado. Ele também exclui todos os IPs dos servidores DNS.

Por algum motivo, independentemente da opção escolhida, notei que os IPs dos servidores DNS continuavam aparecendo. Preciso apenas saber o endereço IP do cliente com problema ao atualizar seu registro 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/