转发要保留原始时间
把各主机的日志集中到一台日志服务器,是保留跨主机时间线的常见做法。关键在于转发时不要用接收方的落地时间覆盖原始记录时间:rsyslog 的模板里要保留来源主机名与原始时间戳,journald 转发时要保留 __REALTIME_TIMESTAMP 这个原始记录时间字段。
落地时间也有参考价值
接收时间并非无用:它是判断日志投递是否延迟、链路是否中断的依据。正常情况两者相差很小;如果某段时间落地时间整体后移,说明队列积压或网络中断,这段时间的日志顺序需要谨慎对待,不能直接当作事件发生顺序。
基本信息
| 适用平台 | Linux(rsyslog、syslog-ng、systemd-journald 转发) |
|---|---|
| rsyslog | 模板中保留 HOSTNAME 与 TIMESTAMP 字段 |
| journald 转发 | 保留 __REALTIME_TIMESTAMP(原始记录时间) |
| 落地时间 | 接收服务器写入时刻,作为投递质量指标 |
| 校验方式 | 抽样比对来源主机本地日志与集中服务器上的同一条记录 |
典型使用场景
- 主机被清理本地日志:靠集中服务器上的副本还原时间线
- 跨主机关联:统一的主机名字段让不同来源可以按主机聚合
- 判断投递延迟:落地时间与原始时间的差值可反映链路状况
- 补全轮转丢失的历史:集中存储周期通常比本机保留更长
- 验证转发配置:抽样核对集中副本与本机日志是否逐条一致
转发配置核对
转发配置核对
# rsyslog 转发相关配置:模板与转发动作
grep -E 'template|^*.*|action' /etc/rsyslog.conf | head -10
grep -R 'omfwd\|@@' /etc/rsyslog.d/ 2>/dev/null
# journald 原始记录时间字段(含接收侧字段可对比)
journalctl --no-pager -n 3 -o json | python3 -m json.tool | grep -E 'REALTIME|MONOTONIC|HOSTNAME'
# 抽样比对:本机与集中服务器上同一条记录的时间字段
# 本机
grep 'sshd' /var/log/auth.log | tail -3
# 集中服务器
grep '<主机名>.*sshd' /var/log/remote/<主机名>/auth.log | tail -3两类时间字段对照
| 字段 | 含义 | 使用建议 |
|---|---|---|
| 原始记录时间 | 事件在主机的产生时刻 | 分析的默认基准 |
| 落地时间 | 日志写入集中服务器的时刻 | 只用于评估投递延迟与中断 |
| 主机名字段 | 日志来源主机 | 缺失时无法按主机聚合 |
| 程序与进程号 | 产生日志的应用与进程 | 跨重启比对时注意复用 |
| 消息文本 | 原始内容 | 字段被改写时以本机副本为准 |
转发链路上的时区处理要统一:来源主机是本地时间而集中服务器按 UTC 记录时,若不转换会造成整体偏移;配置里宜显式指定时间格式。
集中日志同样受保留策略限制,容量不足时会丢弃或轮转删除;定期核对最长可回溯时间,避免真正需要时发现历史已被覆盖。