# 与分析工具的集成

> 将转换后的 CSV 导入 Excel、Power BI、SQL Server、SIEM 或 Python 笔记本——包括让它首次尝试就能成功的分隔符和日期设置。

---

LLMS index: [llms.txt](/llms.txt)

---

转换 DNS 调试日志的意义在于后续的处理。选择 CSV 是因为几乎所有工具都能读取它——但“所有工具都能读 CSV”背后隐藏着两个设置，这两个设置决定了导入是轻松完成还是要折腾一下午。

## 决定一切的两个设置

**分隔符。** 默认是 `;`。对于使用逗号作为小数点的 Excel 区域设置，保持默认即可。对于大多数数据库和数据科学工具，切换为 `,`。无论选择哪个，都要确保导入端使用相同的设置。

**日期格式。** `-OutputCulture` 控制时间戳的写入格式。对于机器读取的任何内容，使用 `sv-SE`（或不变文化），这样 `DateTime` 会输出为 `2026-01-20 23:00:16`：

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
```

下面所有消费者都能无提示地理解该格式。区域特定的输出如 `20.01.2026` 会被导入为文本，或者更糟，被误读为月/日格式。

## Microsoft Excel

查看单个转换日志的最快方式。

- 使用默认的 `;` 分隔符且区域设置匹配时，双击文件即可正确分列打开。
- 如果所有内容都落在 A 列，说明分隔符与 Excel 设置不匹配。可以重新运行时加上 `-Delimiter ","`，或者通过 **数据 → 从文本/CSV** 导入时选择正确的分隔符。
- 将区域转换为表格（`Ctrl+T`），然后基于 `ClientIP`、`QuestionName` 或 `QuestionType` 创建数据透视表。找出最活跃的客户端和域名只需一分钟。
- 超过几十万行时，建议使用 Power Query 或下面介绍的其他选项。

`*_Statistic.csv` 和 `*_PacketStatistic.csv` 文件通常是更好的 Excel 目标——它们是预聚合的，文件体积小。详见[输出格式](../02-output-formats/)。

## Power BI

导入 CSV 文件，构建 DNS 活动、顶级客户端、查询趋势和错误率的仪表盘。

- 指向包含转换文件的*文件夹*，而非单个文件。不同服务器和日期的布局相同，文件会自动追加。
- `ComputerName` 列使多服务器报告成为可能——转换时设置 `-ComputerName`，否则无法按服务器切片。
- `ResponseCode` 和 `QuestionType` 是自然的切片字段；`DateTime` 作为时间轴。
- 使用 `*_PacketStatistic.csv` 而非完整数据文件，可以在只需日趋势时保持模型体积小。

## SQL 数据库

将 CSV 批量导入 SQL Server、PostgreSQL 或其他支持 SQL 的数据库，实现长期存储和可重复查询。

一套现成的操作流程——表定义、转换、`SqlBulkCopy` 导入及检测可疑 `TXT` 活动的查询——详见[使用 SQL Server 的安全分析工作流](../examples/security-analysis-sql/)。

首次导入前值得规划的要点：

- 使用 `-OutputCulture 'sv-SE'`，使时间戳直接落入 `datetime2` 列，无需转换技巧。
- `Information` 和 `Details` 字段可能很长，建议用 `nvarchar(max)`。
- 索引你实际查询的字段——通常是 `DateTime`、`ClientIP` 和 `QuestionName`。
- 保持 `-ComputerName` 字段填充，合并后仍能追踪来源。

## SIEM 系统

Splunk、Elastic、Sentinel 等平台通过 CSV 进行安全遥测的关联和告警。

- 发送压缩输出（`-CompressOutput`）——体积约为原文件的十分之一，大多数采集器能自动解压。
- 字段映射定义一次即可；列布局在不同运行和服务器间保持不变，包括始终存在的尾部 `ComputerName` 列。
- 让采集器去重，或者归档已处理的 `.log` 文件。否则重复处理同一轮换日志会重复发送相同数据。
- `-ContextFilter Packet` 在不需要服务器注释的场景下，降低采集量（及许可费用）。

## Python、R 和数据科学工具

结构化输出可直接用于异常检测、基线分析和自定义分析。

```python
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 就能快速得到答案：

```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 方案。
