外观
3.1 数据接入
约 641 字
可视化数据
本页对应「三、操作步骤」的 3.1,把访问日志整理成面板可读的聚合 JSON,写入固定路径并约定字段名、时间粒度与刷新频率。返回上级:可视化面板。
前置条件
- 访问日志已按天归档,位于
/srv/axis/logs/,每行包含时间、路径、状态码与耗时字段。 - 已确定面板需要的指标:访问量、错误率、平均响应时间、热门路径。
/srv/axis/data目录存在且采集账号可写。
操作步骤
- 先确认日志格式,取一行查看字段位置与时间格式:
mkdir -p /srv/axis/data
head -n 1 /srv/axis/logs/access.log
awk '{print NF}' /srv/axis/logs/access.log | sort -u | head- 按小时聚合生成面板数据,输出固定结构:
LOG=/srv/axis/logs/access.log
OUT=/srv/axis/data/summary.json
awk '{
ts=$4; gsub(/\[/,"",ts);
split(ts,a,":"); hour=a[1]":"a[2];
total[hour]++; code[hour" "$9]++;
if ($9 ~ /^5/) err[hour]++;
sum[hour]+=$NF;
} END {
printf "{\"generated_at\":\"%s\",\"hours\":[", strftime("%Y-%m-%dT%H:%M:%SZ", systime());
first=1;
for (h in total) {
if (!first) printf ",";
printf "{\"hour\":\"%s\",\"requests\":%d,\"errors\":%d,\"avg_ms\":%d}", h, total[h], err[h]+0, sum[h]/total[h];
first=0;
}
print "]}"
}' "$LOG" > "$OUT"
jq '.hours | length' "$OUT"- 校验结构与数值范围,空值或异常值要在接入前处理:
jq -e '.hours | all(.requests > 0)' "$OUT" && echo "requests ok"
jq -r '.hours[0]' "$OUT"- 把生成命令登记到定时任务,按小时刷新数据文件:
crontab -l 2>/dev/null | grep -q 'summary.json' || \
(crontab -l 2>/dev/null; echo '5 * * * * /bin/bash /srv/axis/bin/gen-summary.sh') | crontab -结果确认
summary.json能被jq正常解析,hours数组长度与日志覆盖的小时数一致。- 每条记录包含
hour、requests、errors、avg_ms四个字段,无null。 - 错误数为 0 的小时也保留记录,图表才不会断点。
- 定时任务已登记,下一次整点后文件修改时间会更新。
注意事项
- 时间统一转为 UTC 并在字段名中体现,避免跨时区查看时口径错位。
- 聚合结果只保留统计值,不写入完整 IP 与 URL 参数。
awk的字段位置依赖日志格式,日志格式变更后必须重新核对$4与$9的含义。- 聚合任务失败时要保留上一次成功的结果,面板显示旧数据并在页面标注更新时间,比显示空白更可用。
- 数据文件写入采用先写临时文件再原子替换的方式,避免面板读到写了一半的 JSON。
- 磁盘占用要纳入检查,聚合文件按周归档,长期堆积会拖慢读取。