# 故障排除

> 转换 DNS 调试日志时可能遇到的症状、原因及解决方法。

---

LLMS index: [llms.txt](/llms.txt)

---

## “该文件不是有效的 DNS 调试日志文件”

头部检查拒绝了输入。通常是路径错误——同一文件夹下的 `.log` 文件不是 DNS 调试日志，或者文件只包含了一个轮换头部。

请按以下步骤排查：

1. 打开文件。DNS 调试日志以类似 `Message logging started at …` 的头部行开始，后续是带时间戳的查询条目。
2. 确认 DNS 调试日志确实已启用并写入你预期的路径：

   ```powershell
   Get-DnsServerDiagnostics | Select-Object Enable, LogFilePath, MaxMBFileSize
   ```

3. 如果文件确实是 DNS 日志，但头部不寻常——手动编辑过、预过滤过、或自定义导出——可跳过检查：

   ```powershell
   Convert-DNSDebugLogFile -InputFile "C:\Logs\odd.log" -SkipHeaderValidation
   ```

其他地方请保持验证开启。注意 `-SkipHeaderValidation` 不能与 `-RemoveSourceFile` 一起使用，因此未经验证的文件转换后无法被删除。

## 输出文件为空或行数远少于预期

请按顺序检查：

- **日志中是否包含查询条目？** 刚轮换的日志如果还没发生查询，可能只有头部。
- **是否使用了 `-ContextFilter`？** `-ContextFilter Packet` 会移除 `Event` 和 `Note` 条目。如果过滤为 `Event` 或 `Note`，大多数列也会为空——这些条目只包含 `DateTime`、`ThreadId`、`Context` 和 `Information`。
- **源日志是否仍在写入？** DNS 服务器正在写入的文件在转换时可能变化；最新条目可能缺失，最后一条记录可能被截断。需要完整输出时，请转换已轮换且关闭的日志。
- **文件是否损坏或截断？** 检查日志末尾是否有半写入的行。

## 日期错误、偏移或日月颠倒

日志由与转换会话不同 Windows 区域设置的服务器写入。`20.01.2026` 和 `01/20/2026` 表示同一时间，但前提是双方对格式达成一致。

```powershell
# 日志来自德国服务器
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns-berlin.log" -InputCulture 'de-DE'
```

计划任务中请显式设置 `-InputCulture`，不要依赖运行账户的区域设置。如果输出需要机器可读，添加 `-OutputCulture 'sv-SE'`。详情见[参数和选项](../03-parameters-and-options/)。

## 导入后所有内容都在一列

分隔符不匹配。模块默认写入 `;`，而你的导入程序期望 `,`（或反之）。

要么重新运行转换，指定导入程序需要的分隔符：

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -Delimiter ","
```

…要么告诉导入程序文件使用的分隔符——Excel 中通过 **数据 → 从文本/CSV**，PowerShell 中通过 `Import-Csv -Delimiter ';'`。

## “访问被拒绝”

- DNS 日志目录通常需要管理员权限。以提升权限启动 PowerShell，或用有访问权限的账户运行计划任务。
- 检查输出目录的写权限，不仅是日志的读权限。
- 对 SMB/UNC 路径：以 `SYSTEM` 运行的任务在网络上以**计算机账户**身份认证。请授予该计算机账户（或 `Domain Controllers` 组）共享和 NTFS 权限，或使用专用服务账户。
- 如果 `-RemoveSourceFile` 在成功运行后失败，说明账户有读取权限但无删除权限。

## 处理速度非常慢

1. 先看磁盘——转换受 I/O 限制。繁忙的卷或慢速网络路径会主导运行时间。
2. 如果不需要数据包详细 JSON，使用 `-NoDetailsParsing`；对细节丰富的日志可节省 30–50% 时间。
3. 使用 `-ContextFilter Packet` 减少写入量。
4. 使用 DNS 服务器日志轮换拆分超大日志，而不是转换一个巨大文件。
5. 考虑为日志目录设置杀毒软件排除。

更多信息见[性能](../04-performance/)。

## 压缩后的输出比预期大

内容非常多样的日志——许多唯一域名、许多不同客户端——压缩效果不如重复性强的日志。这是正常的。ZIP 通常仍能大幅减小文件；如果没有，检查 `Details` 列是否膨胀文件，以及你是否真的需要它。

## 统计数据与预期不符

- 确认使用了 `-OutputType Both` 或 `-OutputType Statistic`。使用 `-OutputType CSV` 时不会写入统计文件。
- `Count` 是总计数，不是唯一计数。一个客户端请求同一名称 500 次计为 500。这是“数字不对”的最常见原因。
- 统计按天分组。跨两天的日志会产生两天的行。
- 如果统计文件中 `ComputerName` 为空，说明转换时未设置 `-ComputerName`。

## 计划任务交互式运行正常，但作为任务运行失败

几乎总是以下三种情况之一：

- **找不到模块。** `SYSTEM` 账户加上 `-NoProfile` 只看到机器范围的模块路径。请机器范围安装模块，或在任务动作中显式添加 `Import-Module DNSServer.DebugLogParser`。
- **区域设置错误。** 任务账户的区域设置与你不同。显式设置 `-InputCulture` 和 `-OutputCulture`。
- **执行策略或脚本未签名。** 使任务的 `-ExecutionPolicy` 与你的签名策略匹配，并解除从其他地方复制文件的阻止。

在相同上下文（例如用 PsExec 以 `SYSTEM` 身份）手动运行任务命令行以复现问题。

## 报告问题

如果以上都无效：

1. 更新到最新模块版本并重试。
2. 在 [GitHub issues](https://github.com/AndiBellstedt/DNSServer.DebugLogParser/issues) 搜索相同症状。
3. 收集诊断信息：

   ```powershell
   $PSVersionTable
   Get-Module DNSServer.DebugLogParser -ListAvailable | Select-Object Name, Version, Path
   Get-Culture
   ```

   以及你运行的确切命令、完整错误信息（包括堆栈跟踪），如果可以分享，附上能复现问题的日志小段（已匿名处理）。
4. 使用这些信息新建 issue。
