# 运营最佳实践

> 在让 DNS 日志转换无人值守地运行于生产域控制器之前，需要搞定的事项。

---

LLMS index: [llms.txt](/llms.txt)

---

手动转换日志很简单。关键是如何设计，让它能每晚在每个域控制器上运行多年而无人干预。这些是实践中重要的点。

## 1. 转换已轮换的日志，而非活动日志

在 DNS 服务器上启用日志轮换，只转换已关闭的文件。模块*可以*读取 DNS 服务器当前正在写入的日志，但该文件在转换过程中会发生变化：最新的条目可能缺失，最后一条记录可能被截断。两次运行会产生不同的结果。

标准做法是跳过最新的文件：

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -Skip 1 |
    Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME
```

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">切勿将活动日志与 -RemoveSourceFile 一起使用</div>


删除 DNS 服务器仍在写入的文件，事后发现会很糟糕。请将 `-RemoveSourceFile` 限制在已轮换、已关闭的日志上。
</div>


需要权衡的是：在低流量服务器上，轮换可能超过一天，因此当天的数据会一直未转换，直到文件轮换。请据此调整轮换阈值。

## 2. 计划任务，并赋予合适的身份运行

任务计划程序是常用方案——每天运行是合理的默认。针对域控制器的完整组策略实现，请参见 [基于 GPO 的收集示例](../examples/gpo-driven-collection/)，独立任务示例见 [计划任务示例](../examples/scheduletask/)。

这里常见的三个坑：

- **模块可发现性。** 以 `SYSTEM` 身份运行且带 `-NoProfile` 的任务只会看到机器范围的模块路径。请将模块安装为机器范围，或在任务动作中显式添加 `Import-Module`。
- **区域设置。** 运行任务的账户可能没有你交互测试时的区域设置。请显式设置 `-InputCulture` 和 `-OutputCulture`，不要依赖默认值。
- **网络访问。** 如果源或目标是 UNC 路径，`SYSTEM` 会以计算机账户身份认证。请授予计算机账户（或 `Domain Controllers` 组）共享和 NTFS 权限，或使用专用服务账户运行任务。

## 3. 轮换到你能处理的大小

每个文件 50–200 MB 让转换可预测，且夜间任务能在时间窗内完成。单个文件无限增长最终会拖慢转换。详见 [性能](../04-performance/)。

## 4. 自动化前先验证首批输出

手动转换两三个真实日志，打开 CSV 检查：

- 时间戳正确吗——没有日/月颠倒？（如果有，设置 `-InputCulture`。）
- 分隔符符合下游需求吗？
- `ComputerName` 字段是否填充？
- 需要的上下文是否存在，不需要的是否被过滤？

`-WhatIf` 会显示批处理将处理哪些文件，但不实际操作：

```powershell
Get-ChildItem "C:\Administration\Logs\DNSServer\*.log" |
    Convert-DNSDebugLogFile -RemoveSourceFile -WhatIf
```

## 5. 决定处理完的日志如何处置

仅转换“除最新之外的所有日志”的任务会每天重复处理相同文件。这样简单且稳健，但会覆盖输出，可能导致下游出现重复行。

选一种方案：

- 将处理过的 `.log` 文件移动到归档文件夹
- 在信任管道后用 `-RemoveSourceFile` 删除它们
- 让下游采集器去重

无论选哪种，都要写下来——这是让后续管理员不迷惑的细节。

## 6. 规划存储和保留

压缩（`-CompressOutput`）通常能让 CSV 减少 90% 以上，但数据量仍会积累。根据实际查询率和保留义务估算，设定数据的终止日期，避免无限增长。

长期保留时，考虑使用 `-OutputType Statistic`：每日汇总数据体积小，且通常能回答旧的行级数据所关注的趋势问题。

## 7. 将输出视为敏感信息

解析后的 DNS 日志描述了你的内部命名结构和查询内容，比大多数基础设施日志更具泄露风险，且在某些司法辖区可能被视为个人数据。

- 限制输出文件夹的 NTFS 和共享权限。
- 不要“临时”将 CSV 放在通用文件共享上。
- 将 DNS 日志数据纳入保留和删除策略，而非仅备份策略。
- 压缩输出只是减小体积，不等于保护——关键时刻请使用加密或访问控制。

## 8. 保持头部验证开启

默认的文件头验证确保文件确实是 DNS 调试日志，零成本且防止路径错误导致成千上万无意义行。仅对真正不寻常的格式使用 `-SkipHeaderValidation`，且注意命令不允许与 `-RemoveSourceFile` 一起使用，正是基于此原因。

## 9. 监控任务，而不仅仅是服务器

无人值守的转换悄无声息地停止，比不转换更糟，因为只有在需要数据时才发现缺口。

- 关注非零错误输出；GPO 参考实现故意在 `$Error.Count -gt 0` 时抛出异常，让任务报告失败。
- 监控计划任务的最后结果代码，而不仅仅是任务是否存在。
- 检查输出文件是否真的出现且时间戳是最近的。
- 监控日志卷和输出目标的剩余磁盘空间。

常见失败原因——访问被拒、日志损坏、无效头部——详见 [故障排除](../08-troubleshooting/)。

## 10. 记录工作流程

日志写在哪儿，任务何时运行，使用了哪些参数，输出去哪儿，谁消费，保留多久。六行运维 Wiki 内容。它让整个设置可审计且易于交接。
