# 输出格式

> CSV 数据文件的列、两个可选的统计文件，以及在运行任何操作之前你可以打开的真实示例输出。

---

LLMS index: [llms.txt](/llms.txt)

---

`Convert-DNSDebugLogFile` 每个输入日志最多生成三个文件：

| 文件 | 内容 | 生成条件 |
|---|---|---|
| `<name>.csv` | 每个解析的日志条目一行 | `-OutputType CSV` 或 `Both` |
| `<name>_Statistic.csv` | 每个上下文的每日记录计数 | `-OutputType Statistic` 或 `Both` |
| `<name>_PacketStatistic.csv` | 每个客户端、协议、方向和记录类型的每日查询计数 | `-OutputType Statistic` 或 `Both` |

`Both` 是默认值。输出文件会放在输入文件旁边，除非你设置了 `-OutputFile`。

本页链接的示例文件是真实的转换结果，而非模拟。下载一个并用 Excel 打开，确认后再设计你的管道。

## CSV 数据文件

示例输出：

| 语言环境 | Details 列 | 文件 |
|---|---|---|
| en-US | 未填充 | [WithComputerName](../outputformat/en-us.-.dnsdebug-dc01.-.WithComputerName.csv), [NoComputerName](../outputformat/en-us.-.dnsdebug-dc01.-.NoComputerName.csv) |
| de-DE | 未填充 | [WithComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.NoDetails.csv), [NoComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.NoDetails.csv) |
| de-DE | 已填充 | [WithComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.WithDetails.csv), [NoComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.WithDetails.csv) |

真实转换的两行示例——一个 DNS 查询和一个服务器内部备注：

```text
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;"odc.officeapps.live.com";"";"";dc01
2026-01-20 23:00:16;DF0;Note;;;;;;;;;;;;"";"got GQCS failure on a dead socket context status=995, socket=904";"";dc01
```

### 列说明

始终有 18 列，且顺序固定：

| # | 列名 | 含义 | 典型用途 |
|---|---|---|---|
| 1 | `DateTime` | 条目时间戳 | 时间过滤，与其他日志关联 |
| 2 | `ThreadId` | DNS 服务器工作线程 | 很少用；用于关联服务器内部问题 |
| 3 | `Context` | 条目类型：`Packet`、`Event`、`Note`、`DSPoll`、`Init`、`Lookup`、`Recurse`、`Remote`、`Tombstone` | 首个过滤条件——`Packet` 是实际的 DNS 流量 |
| 4 | `PacketId` | 内部数据包标识符 | 配对查询与响应 |
| 5 | `Protocol` | `UDP` 或 `TCP` | TCP 峰值可能表示大响应或区域传输 |
| 6 | `Direction` | `Rcv`（接收查询）或 `Snd`（服务器响应） | 区分请求量和响应量 |
| 7 | `ClientIP` | 查询主机地址 | 主要流量分析，事件范围界定 |
| 8 | `Xid` | DNS 事务 ID（十六进制） | 匹配请求和响应 |
| 9 | `Type` | `Query` 或 `Response` | |
| 10 | `Opcode` | `Standard`、`Notify`、`Update`、`Unknown` | 区分动态更新和区域通知与普通查询 |
| 11 | `FlagsHex` | 原始头标志（十六进制） | 深度协议分析 |
| 12 | `FlagsChar` | 解码标志：`Authoritative`、`Truncated`、`RecursionDesired`、`RecursionAvailable` | 上述标志的可读版本 |
| 13 | `ResponseCode` | `NOERROR`、`NXDOMAIN`、`SERVFAIL` 等 | 错误率报告，解析失败排查 |
| 14 | `QuestionType` | 记录类型：`A`、`AAAA`、`MX`、`PTR`、`TXT` 等 | `TXT` 量是经典的隧道指标 |
| 15 | `QuestionName` | 查询名称，标准 FQDN | 威胁情报匹配，顶级域报告 |
| 16 | `Information` | `Event` / `Note` 的自由文本；`Packet` 细节块的 TCP/UDP 头行 | 读取服务器消息 |
| 17 | `Details` | `Packet` 细节块的 JSON 表示；否则为空 | 无需回查原始日志即可完整包检查 |
| 18 | `ComputerName` | 来源服务器，来自 `-ComputerName` 参数 | 保持多服务器数据集可归属 |

需要注意两点：

- **并非每行每列都有数据。** 只有 `Packet` 条目有客户端 IP、查询名称和响应码。`Note` 和 `Event` 行的文本在 `Information` 中，协议相关列为空。请据此设计数据库结构和仪表盘过滤器。
- **`ComputerName` 总是最后一列，即使未使用 `-ComputerName` 参数。** 此时该列为空。这样所有服务器的布局一致，方便合并多个 DNS 服务器的文件，无需列映射。

### Details 列

只有当 DNS 服务器配置为记录完整包细节时，才会出现细节块。存在时，解析器将其转换为单个 JSON 值，使该行仍为一行：

```json
{
  "Socket": "848",
  "Remote": "addr 10.10.0.11, port 60580",
  "Buflength": "0x10000 (65536)",
  "Message": {
    "XID": "0x0001",
    "OPCODE": "0 (QUERY)",
    "RCODE": "0 (NOERROR)",
    "QUESTION": [ { "Name": "berlin.de", "QTYPE": "A (1)", "QCLASS": "1" } ],
    "ANSWER": []
  }
}
```

解析这些块会消耗时间并显著增加 CSV 文件大小。如果不需要，使用 `-NoDetailsParsing` 参数——该列仍存在但为空，转换速度更快。详见[性能](../04-performance/)。

## 统计文件

统计是每日汇总。当你想要趋势或汇总数据，而不想移动完整记录集时使用——它们比数据文件小几个数量级。

### 上下文统计（`*_Statistic.csv`）

回答：*每天发生了多少种类的活动？*

```text
Date;Context;Count;ComputerName
2026-01-20;Event;2;dc01
2026-01-20;Note;2;dc01
2026-01-20;Packet;12;dc01
```

| 列名 | 含义 |
|---|---|
| `Date` | 日期，格式固定为 `yyyy-MM-dd` |
| `Context` | 上下文名称（`Packet`、`Event`、`Note` 等） |
| `Count` | 当天该上下文的记录数 |
| `ComputerName` | 来源服务器 |

示例文件：[en-US WithComputerName](../outputformat/en-us.-.dnsdebug-dc01_Statistic.-.WithComputerName.csv), [en-US NoComputerName](../outputformat/en-us.-.dnsdebug-dc01_Statistic.-.NoComputerName.csv), [de-DE WithComputerName](../outputformat/de-de.-.dnsdebug-dc01_Statistic.-.WithComputerName.csv), [de-DE NoComputerName](../outputformat/de-de.-.dnsdebug-dc01_Statistic.-.NoComputerName.csv)

### 包统计（`*_PacketStatistic.csv`）

回答：*谁查询了什么，频率如何，每天？*

```text
Date;ClientIP;Protocol;Direction;QuestionType;Count;ComputerName
2026-01-20;10.0.0.1;UDP;Rcv;A;3;dc01
2026-01-20;10.0.0.1;UDP;Snd;A;3;dc01
2026-01-20;10.0.0.2;UDP;Rcv;A;3;dc01
```

| 列名 | 含义 |
|---|---|
| `Date` | 日期，格式固定为 `yyyy-MM-dd` |
| `ClientIP` | 查询主机 |
| `Protocol` | `UDP` 或 `TCP` |
| `Direction` | `Rcv` 或 `Snd` |
| `QuestionType` | DNS 记录类型 |
| `Count` | 当天匹配包的数量 |
| `ComputerName` | 来源服务器 |

示例文件：[en-US WithComputerName](../outputformat/en-us.-.dnsdebug-dc01_PacketStatistic.-.WithComputerName.csv), [en-US NoComputerName](../outputformat/en-us.-.dnsdebug-dc01_PacketStatistic.-.NoComputerName.csv), [de-DE WithComputerName](../outputformat/de-de.-.dnsdebug-dc01_PacketStatistic.-.WithComputerName.csv), [de-DE NoComputerName](../outputformat/de-de.-.dnsdebug-dc01_PacketStatistic.-.NoComputerName.csv)

<div class="alert alert-info" role="alert"><div class="h4 alert-heading" role="heading">计数是总数，不是唯一值</div>


`Count` 是该日分组内的记录总数。一个客户端查询同一名称 500 次，计数就是 500，而非 1。如果数字看起来过高，通常是这个原因。
</div>


## 分隔符和日期格式

两种输出类型都支持 `-Delimiter`（默认 `;`）和 `-OutputCulture`。对于机器导入，建议使用类似 ISO 的时间戳格式：

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
```

这会生成 `2026-01-20 23:00:16`，SQL Server、Power BI 和 pandas 都能无格式提示正确读取。详情见[参数和选项](../03-parameters-and-options/)。
