<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>关于本说明文档 on PowerShell 模块 DNSServer.DebugLogParser</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/</link><description>Recent content in 关于本说明文档 on PowerShell 模块 DNSServer.DebugLogParser</description><generator>Hugo</generator><language>cn</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>概述</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/01-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/01-overview/</guid><description>&lt;p&gt;Windows DNS 服务器可以写入调试日志。它是一个纯文本文件，设计供人类阅读，在繁忙的域控制器上每天会增长数百兆字节。这样的组合使得当你想回答诸如*“昨晚哪个客户端查询了这个域名 40,000 次？”*这样的问题时，几乎毫无用处。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DNSServer.DebugLogParser&lt;/strong&gt; 将该文本文件转换为 CSV 表格。一条日志行变成一行带有命名列的记录，这样你就可以用 Excel 打开它，加载到 Power BI，批量插入到 SQL Server，或者发送到你的 SIEM。&lt;/p&gt;
&lt;p&gt;该模块包含一个命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Convert-DNSDebugLogFile -InputFile &amp;quot;C:\Windows\System32\dns\dns.log&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就是整个入口点。本站的其他内容都是关于如何大规模、定时以及跨多台服务器执行转换。&lt;/p&gt;
&lt;h2 id="dns-调试日志的样子"&gt;DNS 调试日志的样子&lt;/h2&gt;
&lt;p&gt;原始条目是一行带有位置字段的文本，其中一些字段用括号括起来：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;2026-01-20 23:00:16 0FE0 PACKET 000002C53117D990 UDP Rcv 10.0.0.2 c049 Q [0001 D NOERROR] A (3)odc(9)officeapps(4)live(3)com(0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;转换后，同一事件变成可筛选和排序的 CSV 行：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;&amp;quot;odc.officeapps.live.com&amp;quot;;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;dc01
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意原始格式难以处理而解析器帮你处理的两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查询的名称以 DNS 线格式存储，即 &lt;code&gt;(3)odc(9)officeapps(4)live(3)com(0)&lt;/code&gt;，转换后变成正常的 FQDN。&lt;/li&gt;
&lt;li&gt;一个事件不总是单行。&lt;code&gt;PACKET&lt;/code&gt; 详情块和事件消息会继续出现在缩进的后续行。解析器会将它们附加到所属记录，而不是丢弃或生成孤立行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每条记录最多包含 16 个原生字段——时间戳、协议、方向、客户端 IP、查询类型、查询名称、响应代码、标志等。完整列列表详见&lt;a href="../02-output-formats/"&gt;输出格式&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="为什么要转换"&gt;为什么要转换&lt;/h2&gt;
&lt;h3 id="故障排除"&gt;故障排除&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;查明名称无法解析的原因，以及查询是否到达服务器&lt;/li&gt;
&lt;li&gt;识别配置错误的客户端或频繁请求服务器的应用&lt;/li&gt;
&lt;li&gt;跟踪问题查询的实际来源&lt;/li&gt;
&lt;li&gt;验证区域传送和 DNS 的整体行为&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="性能与容量"&gt;性能与容量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;按查询量排名客户端，找出“吵闹”的客户端&lt;/li&gt;
&lt;li&gt;查看哪些记录类型主导流量&lt;/li&gt;
&lt;li&gt;发现导致不必要查询的配置错误&lt;/li&gt;
&lt;li&gt;跟踪服务器负载变化，而不是凭猜测&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="安全分析"&gt;安全分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检测 DNS 隧道和数据外泄（通常表现为过多的 &lt;code&gt;TXT&lt;/code&gt; 流量——参见&lt;a href="../examples/security-analysis-sql/"&gt;SQL Server 分析示例&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;查找针对恶意软件和指挥控制域的查询&lt;/li&gt;
&lt;li&gt;识别被攻陷主机的查询模式&lt;/li&gt;
&lt;li&gt;监控 DNS 放大攻击滥用&lt;/li&gt;
&lt;li&gt;重建事件发生过程&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="合规与审计"&gt;合规与审计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;满足日志记录和保留要求&lt;/li&gt;
&lt;li&gt;保持网络活动的审计轨迹&lt;/li&gt;
&lt;li&gt;为管理层或审计员生成报告&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="模块工作原理"&gt;模块工作原理&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; 以流方式读取日志并以流方式写入 CSV。文件从未整体加载到内存，因此 100 MB 的日志消耗的内存大致与 10 MB 的日志相同。详情见&lt;a href="../04-performance/"&gt;性能&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>输出格式</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/02-output-formats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/02-output-formats/</guid><description>&lt;p&gt;&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; 每个输入日志最多生成三个文件：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;文件&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
					&lt;th&gt;生成条件&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每个解析的日志条目一行&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType CSV&lt;/code&gt; 或 &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_Statistic.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每个上下文的每日记录计数&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType Statistic&lt;/code&gt; 或 &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_PacketStatistic.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每个客户端、协议、方向和记录类型的每日查询计数&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType Statistic&lt;/code&gt; 或 &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Both&lt;/code&gt; 是默认值。输出文件会放在输入文件旁边，除非你设置了 &lt;code&gt;-OutputFile&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;本页链接的示例文件是真实的转换结果，而非模拟。下载一个并用 Excel 打开，确认后再设计你的管道。&lt;/p&gt;
&lt;h2 id="csv-数据文件"&gt;CSV 数据文件&lt;/h2&gt;
&lt;p&gt;示例输出：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;语言环境&lt;/th&gt;
					&lt;th&gt;Details 列&lt;/th&gt;
					&lt;th&gt;文件&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;en-US&lt;/td&gt;
					&lt;td&gt;未填充&lt;/td&gt;
					&lt;td&gt;&lt;a href="../outputformat/en-us.-.dnsdebug-dc01.-.WithComputerName.csv"&gt;WithComputerName&lt;/a&gt;, &lt;a href="../outputformat/en-us.-.dnsdebug-dc01.-.NoComputerName.csv"&gt;NoComputerName&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;de-DE&lt;/td&gt;
					&lt;td&gt;未填充&lt;/td&gt;
					&lt;td&gt;&lt;a href="../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.NoDetails.csv"&gt;WithComputerName&lt;/a&gt;, &lt;a href="../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.NoDetails.csv"&gt;NoComputerName&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;de-DE&lt;/td&gt;
					&lt;td&gt;已填充&lt;/td&gt;
					&lt;td&gt;&lt;a href="../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.WithDetails.csv"&gt;WithComputerName&lt;/a&gt;, &lt;a href="../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.WithDetails.csv"&gt;NoComputerName&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;真实转换的两行示例——一个 DNS 查询和一个服务器内部备注：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;&amp;quot;odc.officeapps.live.com&amp;quot;;&amp;quot;&amp;quot;;&amp;quot;&amp;quot;;dc01
2026-01-20 23:00:16;DF0;Note;;;;;;;;;;;;&amp;quot;&amp;quot;;&amp;quot;got GQCS failure on a dead socket context status=995, socket=904&amp;quot;;&amp;quot;&amp;quot;;dc01
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="列说明"&gt;列说明&lt;/h3&gt;
&lt;p&gt;始终有 18 列，且顺序固定：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;#&lt;/th&gt;
					&lt;th&gt;列名&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;典型用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;条目时间戳&lt;/td&gt;
					&lt;td&gt;时间过滤，与其他日志关联&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ThreadId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;DNS 服务器工作线程&lt;/td&gt;
					&lt;td&gt;很少用；用于关联服务器内部问题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Context&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;条目类型：&lt;code&gt;Packet&lt;/code&gt;、&lt;code&gt;Event&lt;/code&gt;、&lt;code&gt;Note&lt;/code&gt;、&lt;code&gt;DSPoll&lt;/code&gt;、&lt;code&gt;Init&lt;/code&gt;、&lt;code&gt;Lookup&lt;/code&gt;、&lt;code&gt;Recurse&lt;/code&gt;、&lt;code&gt;Remote&lt;/code&gt;、&lt;code&gt;Tombstone&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;首个过滤条件——&lt;code&gt;Packet&lt;/code&gt; 是实际的 DNS 流量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;PacketId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;内部数据包标识符&lt;/td&gt;
					&lt;td&gt;配对查询与响应&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Protocol&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;UDP&lt;/code&gt; 或 &lt;code&gt;TCP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;TCP 峰值可能表示大响应或区域传输&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;6&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Direction&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Rcv&lt;/code&gt;（接收查询）或 &lt;code&gt;Snd&lt;/code&gt;（服务器响应）&lt;/td&gt;
					&lt;td&gt;区分请求量和响应量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;7&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ClientIP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;查询主机地址&lt;/td&gt;
					&lt;td&gt;主要流量分析，事件范围界定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Xid&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;DNS 事务 ID（十六进制）&lt;/td&gt;
					&lt;td&gt;匹配请求和响应&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;9&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Query&lt;/code&gt; 或 &lt;code&gt;Response&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Opcode&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Standard&lt;/code&gt;、&lt;code&gt;Notify&lt;/code&gt;、&lt;code&gt;Update&lt;/code&gt;、&lt;code&gt;Unknown&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;区分动态更新和区域通知与普通查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;11&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FlagsHex&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;原始头标志（十六进制）&lt;/td&gt;
					&lt;td&gt;深度协议分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;12&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FlagsChar&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;解码标志：&lt;code&gt;Authoritative&lt;/code&gt;、&lt;code&gt;Truncated&lt;/code&gt;、&lt;code&gt;RecursionDesired&lt;/code&gt;、&lt;code&gt;RecursionAvailable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;上述标志的可读版本&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;13&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ResponseCode&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;NOERROR&lt;/code&gt;、&lt;code&gt;NXDOMAIN&lt;/code&gt;、&lt;code&gt;SERVFAIL&lt;/code&gt; 等&lt;/td&gt;
					&lt;td&gt;错误率报告，解析失败排查&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;14&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;QuestionType&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;记录类型：&lt;code&gt;A&lt;/code&gt;、&lt;code&gt;AAAA&lt;/code&gt;、&lt;code&gt;MX&lt;/code&gt;、&lt;code&gt;PTR&lt;/code&gt;、&lt;code&gt;TXT&lt;/code&gt; 等&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;TXT&lt;/code&gt; 量是经典的隧道指标&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;15&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;QuestionName&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;查询名称，标准 FQDN&lt;/td&gt;
					&lt;td&gt;威胁情报匹配，顶级域报告&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;16&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Information&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Event&lt;/code&gt; / &lt;code&gt;Note&lt;/code&gt; 的自由文本；&lt;code&gt;Packet&lt;/code&gt; 细节块的 TCP/UDP 头行&lt;/td&gt;
					&lt;td&gt;读取服务器消息&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;17&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Details&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Packet&lt;/code&gt; 细节块的 JSON 表示；否则为空&lt;/td&gt;
					&lt;td&gt;无需回查原始日志即可完整包检查&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;18&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ComputerName&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;来源服务器，来自 &lt;code&gt;-ComputerName&lt;/code&gt; 参数&lt;/td&gt;
					&lt;td&gt;保持多服务器数据集可归属&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;需要注意两点：&lt;/p&gt;</description></item><item><title>参数和选项</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/03-parameters-and-options/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/03-parameters-and-options/</guid><description>&lt;p&gt;本页以通俗语言解释各选项，且按你通常需要的顺序排列。它是指南，不是规范——权威且始终最新的参数列表在&lt;a href="../commands/convert-dnsdebuglogfile/"&gt;命令参考&lt;/a&gt;和：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-Help Convert-DNSDebugLogFile -Full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="简短版"&gt;简短版&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Convert-DNSDebugLogFile -InputFile &amp;quot;C:\Logs\dns.log&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这单行命令已经给你合理的行为：同时生成数据和统计文件，分隔符为分号，使用你机器的日期格式，启用头部验证，源日志不变。以下内容是微调。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;选项&lt;/th&gt;
					&lt;th&gt;默认值&lt;/th&gt;
					&lt;th&gt;何时更改&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-InputFile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;em&gt;(必需)&lt;/em&gt;&lt;/td&gt;
					&lt;td&gt;始终&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-OutputFile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;输入路径，扩展名为 &lt;code&gt;.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;你想输出到其他位置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-Delimiter&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;你的消费者期望逗号、制表符或管道符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-ComputerName&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;空&lt;/td&gt;
					&lt;td&gt;你合并多个服务器的日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-OutputType&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;你只想要数据，或只要汇总&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-ContextFilter&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;All&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;你只关心实际的 DNS 流量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-InputCulture&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;当前文化&lt;/td&gt;
					&lt;td&gt;日志来自不同区域设置的服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-OutputCulture&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;当前文化&lt;/td&gt;
					&lt;td&gt;机器将读取 CSV&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-NoDetailsParsing&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;关闭&lt;/td&gt;
					&lt;td&gt;吞吐量比数据包内部细节更重要&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-CompressOutput&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;关闭&lt;/td&gt;
					&lt;td&gt;你归档或传输结果&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-RemoveSourceFile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;关闭&lt;/td&gt;
					&lt;td&gt;定时清理，且你信任输出&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-SkipHeaderValidation&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;关闭&lt;/td&gt;
					&lt;td&gt;文件有效但头部不寻常&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="输入和输出"&gt;输入和输出&lt;/h2&gt;
&lt;h3 id="-inputfile"&gt;-InputFile&lt;/h3&gt;
&lt;p&gt;要转换的日志路径。接受数组，也接受管道输入——这就是为什么下面这样写有效：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-ChildItem &amp;quot;C:\Administration\Logs\DNSServer\*.log&amp;quot; | Convert-DNSDebugLogFile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Get-ChildItem&lt;/code&gt; 输出带有 &lt;code&gt;FullName&lt;/code&gt; 属性的对象，&lt;code&gt;-InputFile&lt;/code&gt; 通过属性名接受它（别名包括 &lt;code&gt;FullName&lt;/code&gt;、&lt;code&gt;Path&lt;/code&gt;、&lt;code&gt;FilePath&lt;/code&gt;）。无需 &lt;code&gt;ForEach-Object&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;本地路径和 SMB/UNC 路径都支持：&lt;/p&gt;</description></item><item><title>性能</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/04-performance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/04-performance/</guid><description>&lt;p&gt;繁忙域控制器上的 DNS 调试日志文件很大。&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; 就是为这种情况设计的：它已经经过测试，能够处理 100 MB 及以上的日志，并且在普通服务器硬件上几分钟内完成处理。&lt;/p&gt;
&lt;h2 id="为什么它很快"&gt;为什么它很快&lt;/h2&gt;
&lt;p&gt;你不需要了解这些细节就能使用该模块，但了解这些可以解释你观察到的行为。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;技术&lt;/th&gt;
					&lt;th&gt;你会注意到的效果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;使用带有 64 KB 缓冲区的 &lt;code&gt;StreamReader&lt;/code&gt; / &lt;code&gt;StreamWriter&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;文件以块的形式读取和写入，而不是一次性用 &lt;code&gt;Get-Content&lt;/code&gt; 读取整个文件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;流式处理，单次遍历&lt;/td&gt;
					&lt;td&gt;无论日志多大，内存使用量基本保持平稳&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;使用字符串操作（&lt;code&gt;.Substring()&lt;/code&gt;、&lt;code&gt;.IndexOf()&lt;/code&gt;）代替正则表达式&lt;/td&gt;
					&lt;td&gt;每行 CPU 使用率显著降低，而日志行数以百万计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;手动写入 CSV 而非使用 &lt;code&gt;Export-Csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每条记录没有对象管道的开销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;基于哈希表的统计聚合&lt;/td&gt;
					&lt;td&gt;在同一次遍历中，汇总几乎不额外消耗资源&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;重要的结果是：&lt;strong&gt;整个日志文件从未全部加载到内存中。&lt;/strong&gt; 一个 500 MB 的日志不需要 500 MB 的内存。这就是该模块与大多数自制脚本“读取文件、拆分、构建对象”方法的区别——后者在处理 5 MB 样本时表现良好，但在真实的域控制器日志上会崩溃。&lt;/p&gt;
&lt;h2 id="如何最大化运行效率"&gt;如何最大化运行效率&lt;/h2&gt;
&lt;h3 id="转换轮换的日志块而不是一个巨大的文件"&gt;转换轮换的日志块，而不是一个巨大的文件&lt;/h3&gt;
&lt;p&gt;配置 DNS 服务器在可控大小时滚动日志——50 到 200 MB 是个不错的范围。多个中等大小的文件转换时间可预测，且允许计划任务在时间窗口内完成。而一个不断增长的文件最终会拖慢速度。&lt;/p&gt;
&lt;p&gt;日志轮换还会生成已关闭的文件，这正是你想要的：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-ChildItem &amp;quot;C:\Administration\Logs\DNSServer\*.log&amp;quot; |
 Sort-Object LastWriteTime -Descending |
 Select-Object -Skip 1 |
 Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="不需要详细解析时跳过"&gt;不需要详细解析时跳过&lt;/h3&gt;
&lt;p&gt;如果 DNS 服务器写入了完整的数据包详情，将这些块转换为 JSON 是转换过程中最耗时的部分。&lt;/p&gt;</description></item><item><title>与分析工具的集成</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/05-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/05-integration/</guid><description>&lt;p&gt;转换 DNS 调试日志的意义在于后续的处理。选择 CSV 是因为几乎所有工具都能读取它——但“所有工具都能读 CSV”背后隐藏着两个设置，这两个设置决定了导入是轻松完成还是要折腾一下午。&lt;/p&gt;
&lt;h2 id="决定一切的两个设置"&gt;决定一切的两个设置&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;分隔符。&lt;/strong&gt; 默认是 &lt;code&gt;;&lt;/code&gt;。对于使用逗号作为小数点的 Excel 区域设置，保持默认即可。对于大多数数据库和数据科学工具，切换为 &lt;code&gt;,&lt;/code&gt;。无论选择哪个，都要确保导入端使用相同的设置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日期格式。&lt;/strong&gt; &lt;code&gt;-OutputCulture&lt;/code&gt; 控制时间戳的写入格式。对于机器读取的任何内容，使用 &lt;code&gt;sv-SE&lt;/code&gt;（或不变文化），这样 &lt;code&gt;DateTime&lt;/code&gt; 会输出为 &lt;code&gt;2026-01-20 23:00:16&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Convert-DNSDebugLogFile -InputFile &amp;quot;C:\Logs\dns.log&amp;quot; -OutputCulture 'sv-SE'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面所有消费者都能无提示地理解该格式。区域特定的输出如 &lt;code&gt;20.01.2026&lt;/code&gt; 会被导入为文本，或者更糟，被误读为月/日格式。&lt;/p&gt;
&lt;h2 id="microsoft-excel"&gt;Microsoft Excel&lt;/h2&gt;
&lt;p&gt;查看单个转换日志的最快方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用默认的 &lt;code&gt;;&lt;/code&gt; 分隔符且区域设置匹配时，双击文件即可正确分列打开。&lt;/li&gt;
&lt;li&gt;如果所有内容都落在 A 列，说明分隔符与 Excel 设置不匹配。可以重新运行时加上 &lt;code&gt;-Delimiter &amp;quot;,&amp;quot;&lt;/code&gt;，或者通过 &lt;strong&gt;数据 → 从文本/CSV&lt;/strong&gt; 导入时选择正确的分隔符。&lt;/li&gt;
&lt;li&gt;将区域转换为表格（&lt;code&gt;Ctrl+T&lt;/code&gt;），然后基于 &lt;code&gt;ClientIP&lt;/code&gt;、&lt;code&gt;QuestionName&lt;/code&gt; 或 &lt;code&gt;QuestionType&lt;/code&gt; 创建数据透视表。找出最活跃的客户端和域名只需一分钟。&lt;/li&gt;
&lt;li&gt;超过几十万行时，建议使用 Power Query 或下面介绍的其他选项。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;*_Statistic.csv&lt;/code&gt; 和 &lt;code&gt;*_PacketStatistic.csv&lt;/code&gt; 文件通常是更好的 Excel 目标——它们是预聚合的，文件体积小。详见&lt;a href="../02-output-formats/"&gt;输出格式&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="power-bi"&gt;Power BI&lt;/h2&gt;
&lt;p&gt;导入 CSV 文件，构建 DNS 活动、顶级客户端、查询趋势和错误率的仪表盘。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指向包含转换文件的&lt;em&gt;文件夹&lt;/em&gt;，而非单个文件。不同服务器和日期的布局相同，文件会自动追加。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ComputerName&lt;/code&gt; 列使多服务器报告成为可能——转换时设置 &lt;code&gt;-ComputerName&lt;/code&gt;，否则无法按服务器切片。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResponseCode&lt;/code&gt; 和 &lt;code&gt;QuestionType&lt;/code&gt; 是自然的切片字段；&lt;code&gt;DateTime&lt;/code&gt; 作为时间轴。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;*_PacketStatistic.csv&lt;/code&gt; 而非完整数据文件，可以在只需日趋势时保持模型体积小。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sql-数据库"&gt;SQL 数据库&lt;/h2&gt;
&lt;p&gt;将 CSV 批量导入 SQL Server、PostgreSQL 或其他支持 SQL 的数据库，实现长期存储和可重复查询。&lt;/p&gt;</description></item><item><title>运营最佳实践</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/06-operational-best-practices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/06-operational-best-practices/</guid><description>&lt;p&gt;手动转换日志很简单。关键是如何设计，让它能每晚在每个域控制器上运行多年而无人干预。这些是实践中重要的点。&lt;/p&gt;
&lt;h2 id="1-转换已轮换的日志而非活动日志"&gt;1. 转换已轮换的日志，而非活动日志&lt;/h2&gt;
&lt;p&gt;在 DNS 服务器上启用日志轮换，只转换已关闭的文件。模块&lt;em&gt;可以&lt;/em&gt;读取 DNS 服务器当前正在写入的日志，但该文件在转换过程中会发生变化：最新的条目可能缺失，最后一条记录可能被截断。两次运行会产生不同的结果。&lt;/p&gt;
&lt;p&gt;标准做法是跳过最新的文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-ChildItem &amp;quot;C:\Administration\Logs\DNSServer\*.log&amp;quot; |
 Sort-Object LastWriteTime -Descending |
 Select-Object -Skip 1 |
 Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;切勿将活动日志与 -RemoveSourceFile 一起使用&lt;/div&gt;
&lt;p&gt;删除 DNS 服务器仍在写入的文件，事后发现会很糟糕。请将 &lt;code&gt;-RemoveSourceFile&lt;/code&gt; 限制在已轮换、已关闭的日志上。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;需要权衡的是：在低流量服务器上，轮换可能超过一天，因此当天的数据会一直未转换，直到文件轮换。请据此调整轮换阈值。&lt;/p&gt;
&lt;h2 id="2-计划任务并赋予合适的身份运行"&gt;2. 计划任务，并赋予合适的身份运行&lt;/h2&gt;
&lt;p&gt;任务计划程序是常用方案——每天运行是合理的默认。针对域控制器的完整组策略实现，请参见 &lt;a href="../examples/gpo-driven-collection/"&gt;基于 GPO 的收集示例&lt;/a&gt;，独立任务示例见 &lt;a href="../examples/scheduletask/"&gt;计划任务示例&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;这里常见的三个坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模块可发现性。&lt;/strong&gt; 以 &lt;code&gt;SYSTEM&lt;/code&gt; 身份运行且带 &lt;code&gt;-NoProfile&lt;/code&gt; 的任务只会看到机器范围的模块路径。请将模块安装为机器范围，或在任务动作中显式添加 &lt;code&gt;Import-Module&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区域设置。&lt;/strong&gt; 运行任务的账户可能没有你交互测试时的区域设置。请显式设置 &lt;code&gt;-InputCulture&lt;/code&gt; 和 &lt;code&gt;-OutputCulture&lt;/code&gt;，不要依赖默认值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络访问。&lt;/strong&gt; 如果源或目标是 UNC 路径，&lt;code&gt;SYSTEM&lt;/code&gt; 会以计算机账户身份认证。请授予计算机账户（或 &lt;code&gt;Domain Controllers&lt;/code&gt; 组）共享和 NTFS 权限，或使用专用服务账户运行任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-轮换到你能处理的大小"&gt;3. 轮换到你能处理的大小&lt;/h2&gt;
&lt;p&gt;每个文件 50–200 MB 让转换可预测，且夜间任务能在时间窗内完成。单个文件无限增长最终会拖慢转换。详见 &lt;a href="../04-performance/"&gt;性能&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="4-自动化前先验证首批输出"&gt;4. 自动化前先验证首批输出&lt;/h2&gt;
&lt;p&gt;手动转换两三个真实日志，打开 CSV 检查：&lt;/p&gt;</description></item><item><title>故障排除</title><link>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/08-troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/cn/docs/08-troubleshooting/</guid><description>&lt;h2 id="该文件不是有效的-dns-调试日志文件"&gt;“该文件不是有效的 DNS 调试日志文件”&lt;/h2&gt;
&lt;p&gt;头部检查拒绝了输入。通常是路径错误——同一文件夹下的 &lt;code&gt;.log&lt;/code&gt; 文件不是 DNS 调试日志，或者文件只包含了一个轮换头部。&lt;/p&gt;
&lt;p&gt;请按以下步骤排查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开文件。DNS 调试日志以类似 &lt;code&gt;Message logging started at …&lt;/code&gt; 的头部行开始，后续是带时间戳的查询条目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认 DNS 调试日志确实已启用并写入你预期的路径：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-DnsServerDiagnostics | Select-Object Enable, LogFilePath, MaxMBFileSize
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果文件确实是 DNS 日志，但头部不寻常——手动编辑过、预过滤过、或自定义导出——可跳过检查：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Convert-DNSDebugLogFile -InputFile &amp;quot;C:\Logs\odd.log&amp;quot; -SkipHeaderValidation
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他地方请保持验证开启。注意 &lt;code&gt;-SkipHeaderValidation&lt;/code&gt; 不能与 &lt;code&gt;-RemoveSourceFile&lt;/code&gt; 一起使用，因此未经验证的文件转换后无法被删除。&lt;/p&gt;
&lt;h2 id="输出文件为空或行数远少于预期"&gt;输出文件为空或行数远少于预期&lt;/h2&gt;
&lt;p&gt;请按顺序检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日志中是否包含查询条目？&lt;/strong&gt; 刚轮换的日志如果还没发生查询，可能只有头部。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否使用了 &lt;code&gt;-ContextFilter&lt;/code&gt;？&lt;/strong&gt; &lt;code&gt;-ContextFilter Packet&lt;/code&gt; 会移除 &lt;code&gt;Event&lt;/code&gt; 和 &lt;code&gt;Note&lt;/code&gt; 条目。如果过滤为 &lt;code&gt;Event&lt;/code&gt; 或 &lt;code&gt;Note&lt;/code&gt;，大多数列也会为空——这些条目只包含 &lt;code&gt;DateTime&lt;/code&gt;、&lt;code&gt;ThreadId&lt;/code&gt;、&lt;code&gt;Context&lt;/code&gt; 和 &lt;code&gt;Information&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源日志是否仍在写入？&lt;/strong&gt; DNS 服务器正在写入的文件在转换时可能变化；最新条目可能缺失，最后一条记录可能被截断。需要完整输出时，请转换已轮换且关闭的日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件是否损坏或截断？&lt;/strong&gt; 检查日志末尾是否有半写入的行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="日期错误偏移或日月颠倒"&gt;日期错误、偏移或日月颠倒&lt;/h2&gt;
&lt;p&gt;日志由与转换会话不同 Windows 区域设置的服务器写入。&lt;code&gt;20.01.2026&lt;/code&gt; 和 &lt;code&gt;01/20/2026&lt;/code&gt; 表示同一时间，但前提是双方对格式达成一致。&lt;/p&gt;</description></item></channel></rss>