按小时聚合行数看得见缺口
单一日志文件的记录量在正常情况下是平稳的,把行数按小时聚合后,某个小时突然掉到接近零,或者前后两个小时的数字相差数倍,都是值得追查的信号。与重启记录、轮转时间、服务重载记录对照,就能区分「服务停了」「日志被轮转」「有人清理了日志」这几种完全不同的原因。
syslog 时间不带年份
传统 syslog 格式的时间戳只有月、日与时分秒,没有年份。跨年数据在按小时聚合时会重叠在一起,所以要先按文件与轮转顺序确定每条记录的年份,再统计;否则会得到一份看似正常、实际年份错乱的分布。
基本信息
| 适用平台 | Linux(日志文件与轮转归档) |
|---|---|
| 常用命令 | grep 提取时间字段后配合 awk 聚合、sort、uniq |
| 对照材料 | 轮转时间、重启与关机记录、服务重载记录 |
| 粒度 | 按小时,必要时按十分钟 |
| 注意 | syslog 无年份,跨年需补年份后再统计 |
典型使用场景
- 发现日志清理:某段记录整体缺失,先排除停机与轮转
- 识别服务中断:某类记录的缺失与故障时间吻合
- 评估证据完整性:说明可分析范围与缺口位置
- 验证轮转策略:确认轮转时间点与归档文件数量一致
- 为时间线做区域划分:按缺口把时间线分成若干连续段落
小时聚合与缺口定位
小时聚合与缺口定位
# 按小时统计行数,窗口内数字应用接近
awk '{print $1" "$2" "substr($3,1,2)}' /var/log/auth.log | uniq -c | tail -24
# 加入年份信息后再统计(示例:2026 年的记录)
sed 's/^/2026 /' /var/log/auth.log | awk '{print $1" "$3" "substr($4,1,2)}' | uniq -c | head -24
# 与轮转和重启记录对照
grep -E 'logrotate|rotate' /var/log/syslog 2>/dev/null | tail -5
last -x -f /var/log/wtmp | head -5
# 列出当前与历史文件,确认归档是否连续
ls -l --time-style=long-iso /var/log/auth.log*缺口原因对照
| 表现 | 可能原因 | 核实方式 |
|---|---|---|
| 单小时骤降 | 服务重启或日志轮转 | 查服务重载与轮转记录 |
| 连续多小时为零 | 服务停机或日志停止写入 | 对照启动记录与故障时间 |
| 固定时段重复缺失 | 采集配置排除或过滤规则 | 检查采集配置与规则 |
| 整体突然中断不再恢复 | 日志被清理或转发中断 | 核对归档文件与转发节点 |
| 归档文件数量不足 | 轮转保留份数偏少 | 查看轮转配置 |
聚合时先把压缩归档与当前文件分开统计,再合并结果:混在一起用通配符容易把不同时间段的数字叠加,得出错误的分布。
缺口本身不等于被人清理:重载、崩溃、磁盘写满、转发队列积压都会造成缺口,报告中应写明排除依据,而不是直接定性。