为什么必须先定基准
不同来源的时间戳各带自己的时区:Linux 系统日志多用本地时区,容器常默认 UTC,Windows 事件日志在导出时才附加时区,网络设备有的直接写 UTC、有的写设备本地时间。把它们直接排在一起,等于把不同刻度的尺子混用。规范做法是先选定一个基准(通常是 UTC),把每个来源换算过去,并在报告里同时保留原始值与换算说明,让任何人可以按同一口径复核。
基本信息
| 基准选择 | UTC(记录时以 Z 结尾标注) |
|---|---|
| 需要留痕 | 原始时区、原始值、换算方向、时钟偏移修正量 |
| 采集对象 | 主机时区设置、硬件时钟、NTP 状态、虚拟化宿主与客户机关系 |
| 常见陷阱 | 夏令时切换日、容器与宿主时区不同、跨设备时区各异 |
| 产出 | 时区基线表,作为时间线的附录 |
典型使用场景
- 多主机日志合并前,先统一各主机的时区口径
- 把网络设备日志与主机日志对齐到同一条时间线
- 解释两条来源间固定差值:是时区差还是时钟偏移
- 为时间线报告写换算说明,支撑结论可复核
- 容器化环境中确认容器与宿主机的时区是否一致
- 夏令时切换日的事件核对,避免出现「重复的一小时」
基准与配置检查
基准与配置检查
# 当前 UTC 时间,格式化为 ISO8601 带 Z 结尾
date -u +"%Y-%m-%dT%H:%M:%SZ"
# 本机时区与硬件时钟设置,重点看 Local time / Universal time / Time zone
timedatectl
# 时区缩写与 UTC 偏移(如 CST +0800)
date +"%Z %z"
# 容器内与宿主机时区可能不同,两边都要看
cat /etc/timezone 2>/dev/null || ls -l /etc/localtime
# Windows 侧用 PowerShell 取时区
# Get-TimeZone ; Get-CimInstance Win32_ComputerSystem | Select CurrentTimeZone时区元数据采集清单
| 对象 | 要记录什么 | 示例 |
|---|---|---|
| 分析机 | 时区与 UTC 偏移 | Asia/Shanghai +0800 |
| 被检查主机 | 时区文件指向与生效值 | /etc/localtime 指向 Shanghai |
| 硬件时钟 | RTC 是否使用 UTC | timedatectl 中 RTC in local TZ: no |
| 容器 | 容器内 TZ 变量与挂载的时区文件 | TZ=UTC 与宿主机不一致 |
| 网络设备 | 命令输出中的时区字段 | display clock 显示的 UTC 或本地时间 |
| 日志导出工具 | 导出时是否已做换算 | psort 的 timezone 列 |
换算结果必须与原始值并排保存。只留下换算后的 UTC 时间,一旦换算方向或修正量记错,后续任何人都无法把它还原出来核对。
夏令时地区的本机日志在切换当天会出现同一本地时间对应两个不同 UTC 时刻的情况。这类时间戳在时间线上要单独标注,必要时结合事件先后关系与外部来源判定属于哪一次。