4.1 - Convert-DNSDebugLogFile
SYNOPSIS
将 Windows DNS 服务器调试日志文件转换为 CSV 格式。
SYNTAX
__AllParameterSets
Convert-DNSDebugLogFile [-InputFile] <string[]> [[-OutputFile] <string>] [[-Delimiter] <string>]
[[-ComputerName] <string>] [[-OutputType] <string>] [[-InputCulture] <cultureinfo>]
[[-OutputCulture] <cultureinfo>] [-SkipHeaderValidation] [-RemoveSourceFile] [-CompressOutput]
[-WhatIf] [-Confirm] [<CommonParameters>]
ALIASES
此 cmdlet 有以下别名,
DESCRIPTION
高性能的 Windows DNS 服务器调试日志文件解析器,旨在使 DNS 服务器活动透明化、可分析,并可在报告和分析工具中评估。
DNS 服务器调试日志包含详细的查询/响应信息,但原始文本格式难以分析。
此脚本将这些日志转换为结构化的 CSV 文件,便于导入 Excel、Power BI、SQL 数据库或其他数据分析平台。
主要功能:
- 解析 DNS 调试日志中的所有 16 个字段(日期、时间、协议、客户端 IP、查询类型等)
- 生成结构化 CSV 输出,分隔符可自定义
- 可选生成按客户端、协议和查询类型汇总的统计摘要
- 支持单个文件或通过管道批量处理
- 支持标准和详细的 DNS 调试日志格式
- 可选自动压缩输出文件以节省磁盘空间
- 可选成功处理后删除源文件
- 验证日志文件头以确保数据完整性
使用场景:
- 安全分析:识别可疑的 DNS 查询模式
- 性能监控:跟踪查询量和响应时间
- 容量规划:分析 DNS 服务器负载和客户端分布
- 合规报告:记录 DNS 活动以满足审计要求
- 故障排查:调查 DNS 解析问题
性能优化:
针对大文件(100MB+)优化,使用:
- 字符串操作替代正则表达式解析
- 使用 64KB 缓冲区的 StreamReader/StreamWriter
- 手动生成 CSV,避免 Export-Csv 的开销
- 高效的基于字典的统计收集
兼容性:
- Windows 上的 PowerShell 5.1+
- Windows 上的 PowerShell 7+
- Windows Server 2016 及以后版本
- 支持 DNS Server 2012 R2 到 2025 的调试日志格式
EXAMPLES
EXAMPLE 1
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log"
使用默认设置将 DNS 调试日志转换为 CSV 格式。
输出:C:\Logs\dns.csv(仅数据文件,分号分隔符)。
EXAMPLE 2
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Both
转换 DNS 调试日志并生成两个输出文件。
输出:C:\Logs\dns.csv(数据)和 C:\Logs\dns_statistic.csv(汇总统计)。
EXAMPLE 3
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Statistic
仅生成统计文件,不创建完整的 CSV 数据文件。
输出:C:\Logs\dns_statistic.csv(仅统计)。
EXAMPLE 4
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputFile "C:\Output\parsed.csv"
将 DNS 调试日志转换到自定义输出位置。
输出:C:\Output\parsed.csv。
EXAMPLE 5
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -Delimiter "," -ComputerName "DNS01" -OutputType Both
使用逗号分隔符并添加 ComputerName 列转换日志。
输出:C:\Logs\dns.csv 和 C:\Logs\dns_statistic.csv,ComputerName 列均为 “DNS01”。
EXAMPLE 6
PS C:\> Get-ChildItem "C:\Logs\*.log" | .\Convert-DnsDebugLogFile.ps1 -OutputType Both
通过管道处理多个 DNS 调试日志文件。
输出:每个 .log 文件生成对应的 .csv(数据)和 _statistic.csv(统计)文件。
EXAMPLE 7
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -CompressOutput
转换 DNS 调试日志并将输出压缩为 ZIP 文件。
输出:C:\Logs\dns.zip,包含 dns.csv。压缩后删除未压缩的 csv 文件。
EXAMPLE 8
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputType Both -CompressOutput
转换日志并生成统计数据,同时压缩两个输出文件。
输出:C:\Logs\dns.zip,包含 dns.csv 和 dns_statistic.csv。
EXAMPLE 9
PS C:\> Get-ChildItem "C:\Logs\*.log" | .\Convert-DnsDebugLogFile.ps1 -RemoveSourceFile -CompressOutput
处理多个日志文件,压缩输出并删除源文件。
每个 .log 文件转换为压缩的 .zip 文件,然后删除源 .log 文件。
适合自动化日志归档流程。
EXAMPLE 10
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\old_dns.log" -RemoveSourceFile -Verbose
转换日志文件并在成功处理后删除源文件。
详细输出确认文件已删除。使用时请谨慎,因为源文件会被永久删除。
EXAMPLE 11
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE'
转换来自德国 Windows 服务器的 DNS 调试日志。
当日志文件来自不同区域设置的服务器时使用。
EXAMPLE 12
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture ([System.Globalization.CultureInfo]::GetCultureInfo('sv-SE'))
转换来自瑞典 Windows 服务器、使用 ISO 日期格式(YYYY-MM-DD)的 DNS 调试日志。
适用于处理不同区域设置服务器的日志。
EXAMPLE 13
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -InputCulture 'de-DE' -OutputCulture 'en-US'
转换来自德国 Windows 服务器的 DNS 调试日志,并将输出日期格式化为美国系统格式。
适用于国际服务器日志供美国系统使用。
EXAMPLE 14
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture)
转换 DNS 调试日志,输出日期使用 ISO 8601 格式(YYYY-MM-DD)。
适合跨平台兼容或数据交换场景。
EXAMPLE 15
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -WhatIf
显示如果运行命令会发生什么,但不实际创建任何文件。
适合在处理实际数据前测试命令参数。
EXAMPLE 16
PS C:\> .\Convert-DnsDebugLogFile.ps1 -InputFile "C:\Logs\dns.log" -RemoveSourceFile -CompressOutput -WhatIf
预览完整工作流程,包括压缩和源文件删除。
不创建、压缩或删除任何文件,仅显示将会发生的操作。
PARAMETERS
-CompressOutput
在创建后将输出的 CSV 文件压缩为 ZIP 文件。
创建一个包含生成的 CSV 文件的 .zip 文件,然后删除未压缩的 CSV 文件。
ZIP 文件与输出 CSV 文件位于同一目录,且使用相同的基本名称。
压缩在每个文件处理完后立即进行,以有效管理磁盘空间。
优点:
- 大幅减少磁盘空间占用(CSV 文件压缩效果很好)
- 简化文件管理和归档
- 适合长期存储处理过的日志
示例:输入 ‘dns.log’ 生成 ‘dns.csv’,随后压缩为 ‘dns.zip’,然后删除 ‘dns.csv’。
兼容 PowerShell 5.1+ 和 Windows Server 2016+。
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-ComputerName
可选。
如果指定,将在 CSV 输出中添加一个 ComputerName 列,值为指定内容。
适用于合并多个 DNS 服务器日志时标识来源。
重要提示:这不是远程功能。
脚本仅处理本地文件。
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Server
- DNSServer
- HostName
ParameterSets:
- Name: (All)
Position: 3
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-Confirm
在运行 cmdlet 前提示确认。
指定后,在以下操作前提示确认:
- 处理每个 DNS 调试日志文件
- 删除源文件(当指定 -RemoveSourceFile 时)
- 覆盖已有输出文件
适合交互式处理时控制处理文件。
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- cf
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-Delimiter
CSV 输出的分隔符字符。
默认是分号 ‘;’
Type: String
DefaultValue: ;
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 2
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
指定用于解析 DNS 调试日志中日期/时间值的区域文化。
DNS 服务器调试日志使用生成日志的服务器 Windows 区域设置的日期格式。
此参数允许解析来自不同区域设置服务器的日志。
默认是当前文化 ([System.Globalization.CultureInfo]::CurrentCulture)。
常见文化值:
- ‘de-DE’ 或 ‘de-AT’:德语格式(DD.MM.YYYY 或 DD/MM/YYYY)
- ’en-US’:美国格式(MM/DD/YYYY)
- ’en-GB’:英国格式(DD/MM/YYYY)
- ‘sv-SE’:瑞典/ISO 格式(YYYY-MM-DD)
示例:-InputCulture ‘de-DE’ 用于德国 Windows 服务器的日志。
示例:-InputCulture ([System.Globalization.CultureInfo]::GetCultureInfo(‘sv-SE’)) 用于瑞典日志。
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 5
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
要解析的 DNS 调试日志文件路径。
支持数组以处理多个文件。
Type: String[]
DefaultValue: ''
SupportsWildcards: false
Aliases:
- FullName
- FilePath
- InputPath
- File
- Path
ParameterSets:
- Name: (All)
Position: 0
IsRequired: true
ValueFromPipeline: true
ValueFromPipelineByPropertyName: true
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputCulture
指定用于格式化输出 CSV 文件中日期/时间值的区域文化。
此参数控制 DateTime 值写入 CSV 输出的格式。
当 CSV 文件将被特定区域设置的应用程序或系统使用时非常有用。
默认是当前文化 ([System.Globalization.CultureInfo]::CurrentCulture)。
常见文化值:
- ’en-US’:美国格式(MM/DD/YYYY)
- ‘de-DE’:德语格式(DD.MM.YYYY)
- ’en-GB’:英国格式(DD/MM/YYYY)
- ‘sv-SE’:瑞典/ISO 格式(YYYY-MM-DD)
示例:-OutputCulture ’en-US’ 用于美国系统的日期格式。
示例:-OutputCulture ([System.Globalization.CultureInfo]::InvariantCulture) 用于 ISO 格式。
Type: CultureInfo
DefaultValue: '[System.Globalization.CultureInfo]::CurrentCulture'
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 6
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputFile
可选。
输出 CSV 文件的路径。
如果未指定,使用输入文件名并替换为 .csv 扩展名。
必须是文件路径,不能是目录。
如果只想指定输出目录,请省略此参数,脚本将使用与输入文件相同的目录。
Type: String
DefaultValue: ''
SupportsWildcards: false
Aliases:
- Output
- Destination
- OutFile
- OutputPath
ParameterSets:
- Name: (All)
Position: 1
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-OutputType
指定生成的输出类型。
有效值:
- ‘CSV’:仅生成解析日志数据的 CSV 文件(默认)
- ‘Statistic’:仅生成汇总数据的统计文件
- ‘Both’:同时生成 CSV 和统计文件
默认是 ‘Both’。
Type: String
DefaultValue: Both
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: 4
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-RemoveSourceFile
成功处理后删除源 DNS 调试日志文件。
使用此开关可在成功解析输入文件并创建输出文件后自动删除输入文件。
适用于:
- 自动化日志处理流程
- 日志收集场景中的磁盘空间管理
- 防止重复处理已转换文件
安全特性:
- 仅在成功处理并创建输出后删除文件
- 处理失败或中断时跳过删除
- 不能与 SkipHeaderValidation 一起使用以保证安全
警告:源文件将被永久删除。
使用前请确保输出文件有效。
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
跳过 DNS 调试日志头部验证检查。
默认情况下,脚本会验证输入文件是否具有有效的 DNS 服务器调试日志头结构。
使用此开关可跳过头部验证,适用于:
- 处理修改过或自定义格式的日志
- 解决验证问题
- 处理非标准头部的日志
警告:使用此参数可能导致处理错误,如果文件不是有效的 DNS 日志。
Type: SwitchParameter
DefaultValue: False
SupportsWildcards: false
Aliases: []
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
-WhatIf
显示如果运行 cmdlet 会发生什么。
cmdlet 不会实际运行。
指定后,显示将执行的操作详细信息,但不执行它们。
适用于:
- 预览将处理哪些文件
- 验证输出文件路径
- 在生产环境运行前测试脚本
Type: SwitchParameter
DefaultValue: ''
SupportsWildcards: false
Aliases:
- wi
ParameterSets:
- Name: (All)
Position: Named
IsRequired: false
ValueFromPipeline: false
ValueFromPipelineByPropertyName: false
ValueFromRemainingArguments: false
DontShow: false
AcceptedValues: []
HelpMessage: ''
CommonParameters
此 cmdlet 支持常用参数:-Debug、-ErrorAction、-ErrorVariable、
-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、
-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。更多信息请参见
about_CommonParameters。
System.String[]
NOTES
版本: 1.2.0.0
作者: Andreas Bellstedt, Copilot
日期: 2026-01-23
关键词: Microsoft, Windows Server, DNSServer, DNS, DebugLog, LogParser