DNS 服务器调试日志
这篇文章讲什么?
顾名思义,本文讨论的是 Windows DNS 服务器的调试日志功能。通过阅读本文,您将获得有关如何深入了解您环境中的名称解析过程的信息。这对于故障排除和分析与 DNS 相关的问题非常有帮助。在深入细节之前,让我们首先了解什么是 DNS 服务器调试日志以及它为什么有时是重要的事情和实用的助手。
在许多情况下,DNS 服务器是 Active Directory 环境中域控制器上的一个角色。在任何情况下,DNS 服务器都是网络基础设施的关键组件。名称解析无处不在,是计算机在网络上进行通信的基本部分。
但是,当出现问题时,或者出于某种原因需要接触这个关键组件时会发生什么呢?这可能由于各种原因而发生,例如:
- 故障排除 - 有人报告名称解析出现问题。偶尔,错误的 IP 地址会返回给客户端,导致应用程序停止工作。
- 迁移和变更管理 - 服务器可能需要迁移到其他地方。也许是迁移到新的网络段,进入一个超大规模云服务提供商,或者组织决定将 DNS 从 Active Directory 转移到网络设备。在这一点上,客户端可能需要重新配置以指向新的 DNS 服务器。
- 统计和(安全)分析 - 谁在请求什么?可以观察到什么样的模式?正在发出什么样的请求?是否有可疑活动?
在这种情况下,深入了解名称解析的细节可能是无价的。本文尝试涵盖一些获取这些见解的方法。值得一提的是,当我提到“DNS 客户端”时,我指的是任何请求名称解析的设备,例如工作站、服务器、打印机、IT 基础设施设备,甚至是 IoT 设备。
Windows DNS 服务器洞察的能力
当谈到“如何从 DNS 服务器获取信息?”时,有几种可用的选项。
让我们看看最常见的几种:
能力 - 网络数据包捕获
经典且强大。也许不是长期解决方案,但对于快速故障排除或实时分析,它是非常有价值的。我在上一篇文章中写过 [Capture Network Traffic in Windows][captureNetworkTrafficReference],所以我在这里不再详细讨论。
能力 - 防火墙日志
如果您在网络中实施了分段并且可以访问防火墙日志,您可以从中获取有关谁在进行 DNS 通信(以及所有其他服务)的信息。这不是最详细的信息,因为缺乏粒度和服务特定的细节,但如果已经存在,它可能会很有帮助并且是一个快速的解决方案。 如果您有扁平化的网络,这可能不是一个选项,因为 DNS 客户端和 DNS 服务器之间可能没有防火墙。您仍然可以使用本地 Windows 防火墙,但正如您在接下来的部分中看到的,在这种情况下有更好的选择。 然后不幸的是,还有“组织孤岛”和团队之间“缺乏沟通”的情况,在这种情况下,即使防火墙日志存在,也可能无法获取。
能力 - 事件日志
希望您在 DNS 服务器上配置了事件日志以记录所有事件。如果没有,现在是设置它的时候,因为这是您 Windows DNS 服务中操作日志的良好起点。

这可能不是最详细的信息,但它在经典 Windows 事件日志中产生了基本的见解。
除了经典 Windows 事件日志,还有一些 DNS 服务器特定的应用程序日志可用。许多人知道“应用程序和服务日志”部分中的“DNS 服务器”日志,但它们对于深入了解服务并不那么有趣。

实际上,在文件夹结构中还有两个 DNS 服务器事件日志可用。审计日志提供有关 DNS 服务器中发生的操作类型的操作信息:
另一方面,还有一个不太为人所知的分析日志,可以按需激活。它提供有关正在进行的名称解析过程的非常详细的信息,例如正在发出什么样的查询,正在发送什么样的响应,等等。
此日志默认情况下未激活,但可以为故障排除和分析目的启用。不幸的是,据我所知,“分析”日志无法滚动到多个文件,因此在长期使用时可能会有些棘手。对于短期故障排除或分析,它可能是一个选择。
能力 - 事件跟踪
Windows 事件跟踪(ETW)可能是深入了解 Windows 内部的最强大选项。不幸的是,它也是最复杂的选项,并且不太用户友好。 我可能会在未来的文章中专门讨论 ETW,但现在我在这里不再详细讨论。
能力 - DebugLogFile
Windows DNS 服务器还具有内置的基于文本的调试日志,可以轻松配置。此功能允许您记录与“分析”事件日志相同的详细信息,但它写入文本文件并提供滚动功能,因此可以用于长期使用。

它可能比 ETW 更加用户友好,因为它提供可读的文本,而无需使用 PerfMon 和其他 ETW 工具。然而,日志文件的格式并不是完美结构化的,但仍然可以通过一些努力来获取信息。
如何设置日志记录
现在我们已经有了选项,让我们看看如何设置它。如前所述,我不会在这里讨论数据包捕获、防火墙日志或事件跟踪,但让我们看看事件日志和调试日志文件。
配置分析事件日志
如前所述,“分析”事件日志默认情况下未激活。更重要的是,它默认情况下不可见。 首先,让我们导航到事件查看器中的相关服务日志部分。

在这里,您需要启用 DNS 服务器的分析和调试日志。

之后,日志仍然是禁用的,不会显示任何条目,因此您需要启用日志。

对于不想进行点击操作的人,这里是启用分析日志的命令行:
wevtutil set-log "Microsoft-Windows-DNSServer/Analytical" /e:true
通过启用日志,服务器将开始捕获信息。请注意,日志中没有捕获事件的实时视图。数据收集需要通过再次禁用日志来停止,然后您可以查看捕获的事件。
wevtutil set-log "Microsoft-Windows-DNSServer/Analytical" /e:false

之后,您可以在日志中查看捕获的事件:

由于事件日志的性质,还提供了 XML 数据视图,可以更结构化地查看捕获的事件。这意味着事件日志记录不包含上面截图中的文本消息,而是包含一个原始数据结构,该结构在 Windows 事件查看器中呈现为文本消息。

“分析”日志中的事件可以通过事件查看器导出,但使用 PowerShell 查询和导出事件时,您可能会获得更多灵活性和控制。 记录也可以通过 PowerShell 查询:
# 查询分析日志中的记录
$records = Get-WinEvent -LogName "Microsoft-Windows-DNSServer/Analytical" -Oldest
# 显示前 5 条记录
$records | Select-Object -First 5 | Format-List
请注意 Get-WinEvent 命令中所需的参数“-Oldest”!如果不指定此参数,cmdlet 将在分析日志中返回错误。
配置 DebugLogFile
另一个可能非常有价值的选项是启用 DNS 调试日志文件。如上所述,它是一个基于文本的日志文件,可以轻松启用,并提供有关名称解析操作的详细信息。根据调试日志的配置,提供的详细信息可以从基本的*“谁查询了什么”*到非常、非常详细的信息,包括数据包细节,以及很多of DNS-specific opcodes and flags.
有 两种方法可以启用调试日志文件,可以通过 GUI 或 PowerShell。
GUI 是 “Windows 经典” 的,比较简单,你可以在 DNS 管理器的服务器属性的 “调试日志” 部分找到设置。

实用提示:如果你有多个 DNS 服务器(我想你有),在所有服务器上使用 相同的设置 是个非常好的主意,以便在你的环境中获得一致的数据。
此外,我建议将 服务器的名称放入日志文件名中,以便能够轻松识别日志数据的来源。
即使 GUI 看起来用户友好且简单,它也有一些缺点和弱点。实际上,它并没有提供完整的配置选项,如果你有超过少数几个服务器,它的可扩展性也不够好。 例如,如果你想在 10 个或更多服务器上启用调试日志文件,你需要非常专注,以便在所有服务器上反复进行相同的设置和正确的书写。当数量超过四个时,我通常更喜欢 “Dev-Ops” 方法,而不是 “Click-Ops” 方法。
我对自己懒惰和在重复任务中准确性缺陷的经验迫使我认识到:PowerShell 是最佳选择
因此,毫不奇怪,有 PowerShell cmdlet 可用于 “获取” 和 “设置” DNS 服务器的调试日志设置:
# 获取 DNS 服务器调试日志的设置
Get-DnsServerDiagnostic
# 设置 DNS 服务器调试日志的设置
Set-DnsServerDiagnostic
Get 命令返回 GUI 中的所有选项,以及一些在 GUI 中不可用的附加选项,例如日志的滚动设置和将更多 DNS 服务器特定的内部操作信息添加到调试日志的能力。

重要提示:即使 属性 “MaxMBFileSize” 可能暗示文件大小以 MB 为单位定义,但它 实际上是以字节为单位定义的。因此,如果你想设置 10MB 的文件大小,你需要将值设置为 10485760(10 * 1024 * 1024)。
还要注意 “LogFilePath” 名称的结尾字符!
因为我想要漂亮的文件名,并且 属性 “EnableLogFileRollover” 已启用,日志 文件名以下划线结尾。服务器在创建日志时会将时间戳作为后缀添加到提供的文件名中。通过这种方法,我可以清楚地区分服务器名称和时间戳。
下图显示了属性 “EnableLogFileRollover” 在文件名上的不同表现:

重要提示:理解滚动过程的行为也非常重要。没有整体日志大小设置!这意味着,如果启用了滚动,服务器在达到指定的 MaxMBFileSize 时会创建一个新文件,但可以创建的文件数量没有限制。
这意味着,你需要关注日志文件和服务器上的可用空间!
如果你通过 “设置并忘记” 的方法启用调试日志文件,并且服务器上有生产负载,你可能会填满磁盘。根据查询的数量和详细程度,如果你有很多 DNS 客户端,这可能每天达到多个 GB。
再次强调,不要在这里设置并忘记!
你需要有自己的策略来处理日志文件。没有自动清理。
以下是如何通过 PowerShell 启用调试日志文件的示例:
# 指定所需的 DNS 服务器调试日志参数
$dnsDebugLogParameter = @{
"Queries" = $true
"Answers" = $true
"Notifications" = $true
"Update" = $true
"QuestionTransactions" = $true
"UnmatchedResponse" = $true
"SendPackets" = $true
"ReceivePackets" = $true
"TcpPackets" = $true
"UdpPackets" = $true
"FullPackets" = $false
"FilterIPAddressList" = $null
"EventLogLevel" = 4
"UseSystemEventLog" = $false
"EnableLoggingToFile" = $true
"EnableLogFileRollover" = $true
"LogFilePath" = "C:\Administration\Logs\DNSServer\DnsDebugLog_$($env:COMPUTERNAME).$((Get-CimInstance -ClassName "win32_computersystem").Domain)_.log"
"MaxMBFileSize" = (10 * 1mb)
"SaveLogsToPersistentStorage" = $false
"WriteThrough" = $false
"EnableLoggingForLocalLookupEvent" = $false
"EnableLoggingForPluginDllEvent" = $false
"EnableLoggingForRecursiveLookupEvent" = $false
"EnableLoggingForRemoteServerEvent" = $false
"EnableLoggingForServerStartStopEvent" = $false
"EnableLoggingForTombstoneEvent" = $false
"EnableLoggingForZoneDataWriteEvent" = $false
"EnableLoggingForZoneLoadingEvent" = $false
}
# 应用定义的设置
Set-DnsServerDiagnostics @dnsDebugLogParameter
在下一章中,我们将看看我关于 “如何使用生成的调试日志中的信息” 的想法。在那里,我引用了我自己的 PowerShell 模块 [DNSServer.DebugLogParser][dNSServerDebugLogParserDef] 来解析 Windows 服务创建的调试日志文件。
该模块可在 PowerShell Gallery 中找到,并在我的 [GitHub 账户][githubProfile] 中提供。GitHub 存储库还包含 [在域环境中使用指南的附加文档][dnssLogParserRepository]。在这里,你可以找到可能在你的服务器上应用的脚本。
至于本文的重点,我将不再详细讨论可能的生产环境中的操作细节。希望我在上面做出了明确的声明,你需要在启用此类日志之前关注额外的策略。
数据的消费
好的,通过以上步骤,你在 各个 服务器上有了 数据。这意味着你在各处都有杂乱的数据。在下一步中,你需要关注 消费 数据的过程,并可能将其集中到一个地方。
当然,你可能不会感到惊讶,PowerShell 可能会在这个过程中帮助你。
事件日志
如前所述,“分析” 事件日志可能是快速故障排除的一个非常方便的工具。当我们在前面的部分讨论什么和为什么时,这里有一个快速故障排除会话的示例。这在你需要处理类似 “伙计,你的 DNS 服务器在我询问 ‘xyz’ 时没有返回任何内容。到底怎么回事!” 的问题时非常实用。
请注意,以下示例假设你在管理员工作站上工作,并且有适当的防火墙策略来远程管理你的服务器。如果你直接在服务器上工作,可以简单地跳过命令中的 “-ComputerName” 参数,或者直接在 “-ScriptBlock” 参数中使用代码。
首先,让我们定义一些变量,比如我们查询的服务器:
$Server = "DC01"
你可以直接指定一个或多个服务器。
现在,我们已经声明了要监视的服务器,我们可以在这些服务器上启用分析日志。当完成后,等待一段时间或重现问题,然后再禁用日志。
# 启用分析日志
Invoke-Command -ComputerName $Server -ScriptBlock {
wevtutil.exe set-log "Microsoft-Windows-DNSServer/Analytical" /e:true /q
}
# 等待一段时间以收集数据
# 禁用分析日志
Invoke-Command -ComputerName $Server -ScriptBlock {
wevtutil.exe set-log "Microsoft-Windows-DNSServer/Analytical" /e:false
}
接下来,从日志中捕获记录。根据数据量的不同,这可能需要一些时间,所以请耐心等待。在捕获事件后,需要进行一些工作以使数据更易于使用。
我使用事件日志记录的 Message 属性来提取详细信息,因为它已经包含了 ValueNames。然而,还有 Properties 属性(🤭 写这段文字时,听起来像是 🤪 编程内容)包含所有值的表格,但没有 PropertyNames。如果你喜欢使用 .Properties 属性,你需要做更多的工作才能将值转换为可用格式,这可能会在本地化和不同 Windows 版本之间提供更强的一致性…
# 从服务器中获取事件日志记录
$records = Get-WinEvent -ComputerName $Server -LogName "Microsoft-Windows-DNSServer/Analytical" -Oldest | Where-Object Providername -ne ""
# 处理记录以丰富数据
$propNames = @("MachineName", "LogName", "TimeCreated", "LevelDisplayName", "RecordId", "Message", "ProviderName", "Id", "Version", "Level", "Task", "Opcode", "Keywords", "ProviderId", "ProcessId", "ThreadId", "ContainerLog", "OpcodeDisplayName", "TaskDisplayName")
$dataRecords = foreach ($record in $records) {
$hash = [ordered]@{}
$propNames | ForEach-Object { $hash[$_] = $record.$_}
$record.Message.split(";").trim() | ForEach-Object { $pair = $_.split("="); $hash[$pair[0].replace(":", "").trim()] = $pair[1].trim() }
[PSCustomObject]$hash
}
现在,我们已经将数据转换为更易于使用的格式,我们可以随心所欲地处理它。通过它。
我们可以显示它、导出它,或者对其进行实时 PowerShell 分析。
以下是一些示例:
# 显示数据
$dataRecords | Format-Table
$dataRecords | Out-GridView
$dataRecords | Select-Object -First 1 | Format-List
原始的 Format-Table 可能不太有价值,因为控制台会换行输出。Out-GridView 更加用户友好,因为它提供了一个可滚动和可排序的表格。使用 Format-List,您可以看到单个记录的详细信息,这为您提供了在进一步分析中需要查找和分组的属性信息。
# 导出数据以便在其他工具中使用,如 Excel、PowerBI 或您喜欢的任何工具
$dataRecords | Export-Csv -Path "DNSServer-Analytics.csv" -Delimiter ";" -Encoding UTF8 -NoTypeInformation
导出为 CSV 并将其转移到 Excel 对于许多情况来说似乎是个典型的简单选择,因为这使您能够利用其他工具对数据进行切片和处理。
另一方面,如果您希望在故障排除电话中直接在 PowerShell 中进行一些快速而简单的分析,这也是可以做到的。以下是一些想法:
# 切片和切块... 直接在 PowerShell 中获取数据的信息,进行基本分组
$dataRecords | Group-Object TaskDisplayName
$dataRecords | Group-Object QNAME
$dataRecords | Group-Object InterfaceIP
$dataRecords | Group-Object Source
# 一些更高级的分组示例
$dataRecords | Group-Object { "Source '$($_.Source)' on Interface '$($_.InterfaceIP)'" } | Format-Table Count, Name
$dataRecords | Group-Object { "Source '$($_.Source)' on Interface '$($_.InterfaceIP)' with '$($_.QNAME)'" } | Sort-Object Name | Format-Table Count, Name
$dataRecords | Group-Object { "'$($_.QNAME)' - Source '$($_.Source)' ($($_.TaskDisplayName))" } | Sort-Object Name | Format-Table Count, Name
$dataRecords | Group-Object { "'$($_.QNAME)' - Source '$($_.Source)' on Interface '$($_.InterfaceIP)' ($($_.TaskDisplayName))" } | Sort-Object Name | Format-Table Count, Name
# 分组结合过滤
$dataRecords | Where-Object TaskDisplayName -like "LOOK_UP" | Group-Object { "Source '$($_.Source)' - '$($_.QNAME)'" } | Sort-Object Name | Format-Table Count, Name
# 在我们探索了基本分组的可能值后,我们可以过滤并列出记录及其详细信息
$dataRecords | Where-Object TaskDisplayName -like "LOOK_UP" | Where-Object Source | Sort-Object TimeCreated | Format-Table MachineName, TimeCreated, Source, InterfaceIP, QNAME, QTYPE
$dataRecords | Where-Object TaskDisplayName -like "LOOK_UP" | Where-Object Source -like "10.1.1.1" | Sort-Object QNAME | Format-Table MachineName, TimeCreated, Source, InterfaceIP, QNAME, QTYPE
通过展示这些,我希望能给您一些如何从数据中获取洞察的想法,以及如何使用 PowerShell 来实现这一点。
当然,还有很多其他选项可用,这可能不适合非常大的数据集或长时间的数据。因此,让我们看看下一章…
DebugLogFile
关注 DNS 调试日志文件选项提供了一种处理无人值守和 长期 方法的解决方案。它在大型环境中可能也更具可扩展性。该文件本身是基于文本的,因此可以通过在记事本中打开它来读取。

不幸的是,格式并不是完美结构化的,因此需要进行一些数据处理,以便将数据转换为更可用的格式。因此,就像我们之前处理事件日志一样,让我们进入 PowerShell 进行一些解析魔法。

在对调试日志文件格式进行一些研究和 AI 工作时,搞笑的是,AI 抱怨说,该格式并不完美结构化,难以解析。🤪
为了应对这一挑战,我创建了一个 名为 [DNSServer.DebugLogParser][dNSServerDebugLogParserDef] 的 PowerShell 模块。
该模块提供了一个 cmdlet 内的全面解析逻辑。 它基本上是一个将“难以解析的日志文件”转换为有效且易于使用的 CSV 文件的“一站式商店”。该模块处理所有必要的步骤。
在该模块的 [GitHub 仓库][dnssLogParserRepository] 的 [assets 文件夹][dnssLogParserRepositoryExampleFolder] 中,您可以找到一些示例日志文件及其转换后的 CSV 文件以供查看。显然,您也可以并且应该使用您环境中的文件!
因此,为了给您一个关于转换过程的快速示例,这里是一个如何使用该模块将调试日志文件转换为 CSV 文件的简单示例:
# 导入模块(确保在之前安装它)
Import-Module DNSServer.DebugLogParser
# 解析调试日志文件并导出为 CSV
Convert-DNSDebugLogFile "DnsDebugLog_DC01.log"
通过使用命令的所有默认设置,您将从转换过程中获得 3 个 CSV 文件作为输出。
| 文件 | 描述 |
|---|---|
| DnsDebugLog_DC01.csv | 这是转换后的日志文件,其详细信息以 CSV 样式格式呈现 |
| DnsDebugLog_DC01_Statistic.csv | 一个包含日志中所有类型记录的每日统计汇总的 CSV |
| DnsDebugLog_DC01_PacketStatistic.csv | 一个针对“数据包”类型的统计 CSV,汇总了每日所有客户端 |
如前面部分所述,这些 CSV 可用于在 Excel、PowerBI 或您喜欢的任何工具中进行进一步分析。生成多个文件的意图是应对大型环境中的 大数据 挑战。
根据您的用例,您可能只想要使用统计信息。通过这种方法,您不需要检查完整日志中的所有详细信息。它可以大大减少存储量,因为它已经汇总了数据并忽略了所有嘈杂的细节。
如果您想深入挖掘和分析细节,您可能希望使用完整日志并忽略统计信息,因为它们提供的细节不足。
但如果有一个参数可以指定您想要的输出文件,那不是很好吗?
向 -OutputType 参数打个招呼!
Convert-DNSDebugLogFile -InputFile "DnsDebugLog_DC01.log" -OutputType Statistic
通过这个,您可以指定是否只想要日志、只想要统计信息,还是两者都有。这为您提供了更多灵活性,并可能为您节省大量存储空间。
通过检查生成的 CSV 文件,您可能会发现 CSV 中有一个名为“ComputerName”的空列。

这是因为 DNS 调试日志不包含服务器的名称。🤷♂️
您可以通过在命令中将服务器名称传递给 -ComputerName 参数来为此列赋予生命。
# 手动指定计算机名称
Convert-DNSDebugLogFile -InputFile "DnsDebugLog_DC01.log" -ComputerName "DC01"
您还记得我在 配置调试日志文件 部分中关于 将服务器名称放入日志文件名称中 的建议吗? 通过实践,您可以通过拆分文件名将服务器名称动态地放入 CSV 文件中。
# 从文件名中自动提取计算机名称
$files = Get-ChildItem c:\logs\*.log
foreach($file in $files) {
Convert-DNSDebugLogFile -InputFile $file.FullName -ComputerName $file.BaseName.split("_")[1]
}
如果您有多个服务器并希望在 CSV 中包含服务器名称以便于识别和分析,这尤其有帮助。
您可能还想注意生成的 CSV 中的日期格式。默认情况下,使用底层日志文件的格式。
这可能会在您有国际环境和本地化服务器的情况下造成挑战。服务器之间的日期格式可能会有所不同。当您想在 Excel 或 PowerBI 等工具中对日期进行分析时,这将造成挑战,因为它们可能无法正确识别日期格式。为了解决这个问题,您可以在命令中使用另一个参数… 欢迎使用 -OutputCulture 参数。
我个人对日期格式的偏好是 ISO 格式,因此我通常设置瑞典输出文化(“sv-SE”),因为它使用 ISO 格式表示日期和时间。通过这样做,我可以确保生成的 CSV 中的日期格式是一致的、可排序的,并且易于识别,无论区域设置如何。
Convert-DNSDebugLogFile -InputFile "DnsDebugLog_DC01.log" -OutputCulture "sv-SE"
作为附注,如果您知道源服务器上明确使用的格式,还有一个 -InputCulture 参数。该参数的行为与 -OutputCulture 参数相同,但用于指定解析源日志文件中日期的文化。
最后但并非最不重要的是,两个用于生产使用的实用提示:
在将原始日志文件转换为 CSV 后,您可能希望删除它以节省存储空间。CSV 应包含所有信息,以更可用的格式。使用 -RemoveSourceFile 参数,您可以轻松做到这一点。
由于日志文件是纯文本并且可能相当大,您可能希望在转换后将其压缩。使用 -CompressOutput 参数,您也可以在转换时做到这一点。
Convert-DNSDebugLogFile -InputFile "DnsDebugLog_DC01.log" -OutputCulture "sv-SE" -RemoveSourceFile -CompressOutput
结合上述所有内容,您可以拥有一个相当强大且灵活的工具,从 DNS 调试日志中获取数据以进行进一步分析,同时也考虑到存储空间和文件管理。作为最后一个例子,我想提出一个更完整的示例,您可以在生产环境中使用:
# 从日志文件夹获取完全写入(滚动过的)日志文件
$files = Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" | Sort-Object lastwritetime, Name -Descending | Select-Object -Skip 1
# 将文件传递到转换中,使用所有适用于生产的实用参数
foreach($file in $files) {
$file | Convert-DNSDebugLogFile -ComputerName $file.BaseName.split("_")[1] -Delimiter ';' -OutputType 'Both' -ContextFilter Packet -OutputCulture sv-SE -CompressOutput -RemoveSourceFile
}
这个示例,特别是在文件选择过程中的过滤,旨在直接在 DNS 服务器上运行。但在专用机器上运行也是可以的,以节省 DNS 服务器上的资源。如果在专用机器上运行,则在文件选择过程中不需要使用 Select-Object -Skip 1。

无论如何,您都需要负责收集文件,无论它们是最终处理的文件还是原始日志文件。通过所示的示例,优点是您只需传输已经压缩的 ZIP 文件。这可能是节省网络带宽的好方法,特别是当您有大量日志数据的广泛分布的服务器时。
创建报告
在配置和收集数据之后,您可能希望利用这些数据来创建有价值的洞察和报告。根据您的用例,有不同的工具可供使用。让我们看看一些选项。
我完全意识到还有许多其他工具和方法可用,因此将以下部分视为基本示例,以便了解可能性。
PowerShell - 快速解决方案
正如在数据消费 - 事件日志部分中概述的那样,您可以通过导入数据直接在 PowerShell 中进行一些快速分析。这在快速故障排除会话中可能很方便,您只想快速获取一些基本信息。当然,这不是复杂分析或长期报告的一流解决方案,但这是可能的。
我在这里不会详细说明,因为我们已经在数据消费 - 事件日志部分中涵盖了基本的分组和过滤选项。作为另一个示例,使用 Group-Object 的相同方法也可以应用于 DebugLogFile 的 CSV 文件:
# 从生成的 CSV 文件中导入数据
$dataRecords = Get-ChildItem C:\Administration\Logs\DNSServer\*_PacketStatistic.csv -File -Recurse | Import-Csv -Delimiter ";" -Encoding utf8
# 总结进行了多少 DNS 查询
$dataRecords | Measure-Object Count -Sum
# 数据中有哪些服务器
$dataRecords | Group-Object ComputerName -NoElement
# 收集了什么类型的 DNS 查询
$dataRecords | Group-Object QuestionType -NoElement
# 与服务器联系的 DNS 客户端 IP
$dataRecords | Group-Object ClientIP -NoElement
# 哪些 DNS 客户端与哪些服务器进行通信
$dataRecords | Group-Object { "$($_.ClientIP) --> $($_.ComputerName)" } | Format-Table Name -AutoSize
特别是关于 ClientIP 分组 的最后一个示例可以非常方便地构建 IP 和相应系统名称的关联表。这当然需要适当的 DNS 基础设施,所有设备都已注册。以下是如何使用 PowerShell 实现这一点:
# 从数据记录中获取唯一客户端 IP 的列表
$clientIPList = $dataRecords | Group-Object ClientIP -NoElement | Select-Object -ExpandProperty Name
# 将客户端 IP 解析为主机名并创建映射表
$clientMapping = foreach ($clientIP in $clientIPList) {
if ($clientIP -in ("127.0.0.1", "0.0.0.0", "::1", ".")) {
[pscustomobject]@{
ClientIP = $clientIP
Name = "DNS 服务器上的本地主机"
}
} else {
$result = Resolve-DnsName -Name $clientIP -Type PTR -QuickTimeout -ErrorAction SilentlyContinue
if (([array]$result).count -ge 1) {
[pscustomobject]@{
ClientIP = $clientIP
Name = (($result.NameHost | Sort-Object) -join "; ")
}
} else {
[pscustomobject]@{
ClientIP = $clientIP
Name = "<无法通过 DNS 解析的名称>"
}
}
}
}
# 输出客户端映射表
$clientMapping | Format-Table -AutoSize
# 将客户端映射导出到 CSV 文件以供进一步使用
$clientMapping | Export-Csv -Path "ClientIP_Mapping.csv" -Delimiter ";" -Encoding UTF8 -NoTypeInformation
这样的客户端映射可能会很方便和有帮助。结果可能如下所示:

Excel - 经典灵活的选项
使用 Excel 可能是快速和灵活的基于 CSV 的分析的最常见方法。对此没有任何问题,因为 Excel 提供了许多过滤、分组和可视化数据的选项,以获取有价值的信息。它也非常用户友好,大多数人对此都有一定的了解。唯一的缺点是,对于非常大的数据集,它可能不太适合。
对于“谁在使用我的 DNS 服务器进行什么类型的查询?”的快速分析,Excel 完全可以。简单地将生成的 PacketStatistic CSV 文件放入一个文件夹,并告诉 Excel 通过数据选项卡导入该文件夹。

通过选择文件夹,Excel 将自动导入其中的所有 CSV 文件并将它们合并为一个表。由于 packetstatistic 文件并不大,因此即使在中型环境中有几台服务器,这也应该很好地工作。
数据导入后,您可以使用 Excel 的功能根据需要分析和可视化数据。通过在 PowerQuery 中对数据导入逻辑进行更多投资,或在之后使用额外的公式列,您可以将 CSV 中的客户端 IP 与上述示例中的 ClientIP_Mapping.csv 文件进行关联,以便将客户端名称放入同一表中。

通过利用“数据透视表”功能结合数据透视图,可视化数据非常简单,并提供了许多切片和切块的选项。
这可以是如上所示的概览或时间驱动的图表。

不要忘记像这样的多维数据表,显示不同 DNS 客户端的查询类型分布。

所有这些仅应作为示例……我想清楚地指出,这可能不符合您的需求或您公司或客户的设计。将其视为创建您自己内容的灵感。 如果您想查看我用来构建所示示例的公式和数据透视逻辑,这里是[包含数据和示例的 Excel 文件][dnsStatisticsFile]。
PowerBI - 现代强大的选择
当涉及到“大数据”在“大型企业环境”中时,PowerBI 是一个强有力的竞争者。Excel 可能会达到其极限,因为它并不是为了处理非常大的数据集而设计的。当您有几百台服务器时,文件的数量甚至文件中的记录很快就会达到成千上万、百万甚至十亿的数量。
这就是 PowerBI 发挥作用的地方,因为它旨在处理大数据集,提供强大的分析和可视化,并具有定期自动刷新和被多个用户使用的能力,而无需了解底层数据的处理方式。
PowerBI 中的导入逻辑与 Excel 数据导入中的相同,[PowerQuery][powerQueryDocLink]。因此,这意味着 PowerBI 和 Excel 中的导入逻辑或多或少是相同的。区别在于 PowerBI 在导入后如何处理数据,以及如何提供可视化和共享的选项。 我相信,PowerBI 和 Fabric 的专家们可能会因为将 PowerBI 与 Excel 进行比较而惩罚我,但为了基本理解,我们就保持这一点。我不会深入讨论 PowerBI 特定功能,因为这超出了本文的范围,但我想给您一些关于它可能看起来如何的想法。


与前一部分中提到的 Excel 示例相同……一切都只是示例,可能不符合您的需求。我没有在 PowerBI 报告的设计上投入太多精力,因为我只是想提供一些基本理解的示例。根据您环境的大小和数据量,您的报告可能看起来完全不同。
关键是,使用 PowerBI,您可以创建自己的报告和仪表板,可以自动刷新。定期进行,并且可以被多个用户轻松访问,而无需了解底层数据的处理方式。
如果你仍然想查看包含示例的 PowerBI 文件,这里是 [PowerBI 文件与数据和示例][pbiStatisticsFile]。
结论
综上所述,你现在已经具备了深入了解 DNS 服务器调试日志记录的能力。

你掌握了启用和配置调试日志记录的知识,以及如何使用和分析生成的数据。无论你选择在 PowerShell 中进行快速分析,还是在 Excel 或 PowerBI 中创建详细报告,选择权在于你。只需记住,能力越大,责任越大,因此要注意你收集的数据量以及使用方式。
🚀 祝你记录和分析愉快! 🚀
相关链接
- [Microsoft Docs: DNS 服务器中的调试日志][msDebugLoggingInDnsServer] - 关于启用和使用 DNS 服务器调试日志的官方文档。
- [PowerShell Gallery: DNSServer.DebugLogParser][dNSServerDebugLogParserDef] - 用于解析 DNS 服务器调试日志文件的 PowerShell 模块。
- [GitHub Repository: DNSServer.DebugLogParser][dnssLogParserRepository] - DNSServer.DebugLogParser 模块的 GitHub 仓库,包括文档和示例脚本。
- [PowerQuery 文档][powerQueryDocLink] - PowerQuery 的官方文档,这是一个强大的数据转换和分析工具,可与 Excel 和 PowerBI 一起使用。
- [PowerBI 文档][powerBIDocLink] - PowerBI 的官方文档,这是一个强大的商业分析工具,可用于创建交互式报告和仪表板。
其他链接
来自 [makeameme.org][makeAMemeLink] 的表情包
