与分析工具的集成

将转换后的 CSV 导入 Excel、Power BI、SQL Server、SIEM 或 Python 笔记本——包括让它首次尝试就能成功的分隔符和日期设置。

For AI agents: a documentation index is available at /llms.txt; a markdown version of this page is available at /cn/docs/05-integration/index.md.

转换 DNS 调试日志的意义在于后续的处理。选择 CSV 是因为几乎所有工具都能读取它——但“所有工具都能读 CSV”背后隐藏着两个设置,这两个设置决定了导入是轻松完成还是要折腾一下午。

决定一切的两个设置

分隔符。 默认是 ;。对于使用逗号作为小数点的 Excel 区域设置,保持默认即可。对于大多数数据库和数据科学工具,切换为 ,。无论选择哪个,都要确保导入端使用相同的设置。

日期格式。 -OutputCulture 控制时间戳的写入格式。对于机器读取的任何内容,使用 sv-SE(或不变文化),这样 DateTime 会输出为 2026-01-20 23:00:16

Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'

下面所有消费者都能无提示地理解该格式。区域特定的输出如 20.01.2026 会被导入为文本,或者更糟,被误读为月/日格式。

Microsoft Excel

查看单个转换日志的最快方式。

  • 使用默认的 ; 分隔符且区域设置匹配时,双击文件即可正确分列打开。
  • 如果所有内容都落在 A 列,说明分隔符与 Excel 设置不匹配。可以重新运行时加上 -Delimiter ",",或者通过 数据 → 从文本/CSV 导入时选择正确的分隔符。
  • 将区域转换为表格(Ctrl+T),然后基于 ClientIPQuestionNameQuestionType 创建数据透视表。找出最活跃的客户端和域名只需一分钟。
  • 超过几十万行时,建议使用 Power Query 或下面介绍的其他选项。

*_Statistic.csv*_PacketStatistic.csv 文件通常是更好的 Excel 目标——它们是预聚合的,文件体积小。详见输出格式

Power BI

导入 CSV 文件,构建 DNS 活动、顶级客户端、查询趋势和错误率的仪表盘。

  • 指向包含转换文件的文件夹,而非单个文件。不同服务器和日期的布局相同,文件会自动追加。
  • ComputerName 列使多服务器报告成为可能——转换时设置 -ComputerName,否则无法按服务器切片。
  • ResponseCodeQuestionType 是自然的切片字段;DateTime 作为时间轴。
  • 使用 *_PacketStatistic.csv 而非完整数据文件,可以在只需日趋势时保持模型体积小。

SQL 数据库

将 CSV 批量导入 SQL Server、PostgreSQL 或其他支持 SQL 的数据库,实现长期存储和可重复查询。

一套现成的操作流程——表定义、转换、SqlBulkCopy 导入及检测可疑 TXT 活动的查询——详见使用 SQL Server 的安全分析工作流

首次导入前值得规划的要点:

  • 使用 -OutputCulture 'sv-SE',使时间戳直接落入 datetime2 列,无需转换技巧。
  • InformationDetails 字段可能很长,建议用 nvarchar(max)
  • 索引你实际查询的字段——通常是 DateTimeClientIPQuestionName
  • 保持 -ComputerName 字段填充,合并后仍能追踪来源。

SIEM 系统

Splunk、Elastic、Sentinel 等平台通过 CSV 进行安全遥测的关联和告警。

  • 发送压缩输出(-CompressOutput)——体积约为原文件的十分之一,大多数采集器能自动解压。
  • 字段映射定义一次即可;列布局在不同运行和服务器间保持不变,包括始终存在的尾部 ComputerName 列。
  • 让采集器去重,或者归档已处理的 .log 文件。否则重复处理同一轮换日志会重复发送相同数据。
  • -ContextFilter Packet 在不需要服务器注释的场景下,降低采集量(及许可费用)。

Python、R 和数据科学工具

结构化输出可直接用于异常检测、基线分析和自定义分析。

import pandas as pd

df = pd.read_csv(
    r"C:\Administration\Logs\DNSServer\dns.csv",
    sep=";",
    parse_dates=["DateTime"],
)

# 查询次数最多的前 20 个名称,仅限查询方向
top = (
    df[df["Direction"] == "Rcv"]
    .groupby("QuestionName")
    .size()
    .sort_values(ascending=False)
    .head(20)
)
print(top)

parse_dates 在使用 -OutputCulture 'sv-SE' 导出时开箱即用。接下来,pandas、scikit-learn 或 R 可以照常处理聚类、季节性和异常检测。

继续使用 PowerShell

你不必离开 PowerShell 就能快速得到答案:

$dns = Import-Csv "C:\Administration\Logs\DNSServer\dns.csv" -Delimiter ';'

# 最活跃的客户端
$dns | Where-Object Direction -eq 'Rcv' |
    Group-Object ClientIP |
    Sort-Object Count -Descending |
    Select-Object -First 10 Count, Name

# 查询失败的记录
$dns | Where-Object ResponseCode -eq 'NXDOMAIN' |
    Group-Object QuestionName |
    Sort-Object Count -Descending |
    Select-Object -First 10 Count, Name

Import-Csv 会将整个文件读入内存,适合处理轮换后的文件块,不适合多 GB 的导出文件——这时应使用数据库或 SIEM 方案。