外观
3.3 报表导出
约 706 字
日志分析
本页对应「三、操作步骤」的 3.3,按 3.2 固定下来的口径聚合出日报与周报,导出 CSV 与 JSON,并做一次抽样核验后归档。返回上级:访问日志分析。
前置条件
- 3.2 的口径说明已定稿,统计脚本可重复执行且结果稳定。
- 报表目录
/srv/axis/reports存在且可写,命名规则为daily-YYYY-MM-DD.csv。 - 已确定接收方需要的字段:日期、访问量、独立访客、错误率、热门路径。
操作步骤
- 生成单日报表,输出表头与一行数据,字段顺序与接收方约定一致:
LOG=/srv/axis/logs/access-2026-05-19.log
OUT=/srv/axis/reports/daily-2026-05-19.csv
awk 'BEGIN{OFS=","; print "date","pageviews","visitors","error_rate","top_path"}
{
p=$7; sub(/\?.*/, "", p);
if (p ~ /\.(css|js|png|jpg|jpeg|gif|svg|ico|woff2?)$/) next;
total++; cnt[p]++; ip[$1]=1;
if ($9 ~ /^5/) err++;
} END {
top=""; max=0;
for (k in cnt) if (cnt[k] > max) { max=cnt[k]; top=k }
printf "%s,%d,%d,%.4f,%s\n", "2026-05-19", total, length(ip), err/total, top
}' "$LOG" > "$OUT"
cat "$OUT"- 汇总一周的日报,生成周报并保留中间文件:
head -n 1 /srv/axis/reports/daily-2026-05-19.csv > /srv/axis/reports/weekly-2026-05-19.csv
for f in /srv/axis/reports/daily-2026-05-1[3-9].csv; do tail -n +2 "$f"; done \
>> /srv/axis/reports/weekly-2026-05-19.csv
awk -F, 'NR>1 {v+=$2; u+=$3; e+=$4; n++} END {printf "avg_views=%.0f avg_visitors=%.0f avg_err=%.4f days=%d\n", v/n, u/n, e/n, n}' \
/srv/axis/reports/weekly-2026-05-19.csv- 同时导出 JSON 版本,供面板或接口直接读取:
jq -Rn '[inputs | split(",") | select(length==5)
| {date: .[0], pageviews: (.[1]|tonumber), visitors: (.[2]|tonumber), error_rate: (.[3]|tonumber)}]' \
< /srv/axis/reports/weekly-2026-05-19.csv > /srv/axis/reports/weekly.json
jq 'length' /srv/axis/reports/weekly.json- 抽样核验:用
grep统计某一热门路径的请求数,与报表中的top_path数量级对照。
grep -c 'GET /notes/link-check/' "$LOG"结果确认
- CSV 表头与数据行字段数一致,用
awk -F, 'NF!=5'检查时无输出。 - 周报行数等于 7,平均值处于合理区间,没有跳变的异常日。
- JSON 能被
jq解析,length与 CSV 行数一致。 - 抽样路径的计数与报表趋势一致,量级差异可解释。
注意事项
- 报表文件名带日期,覆盖写入前先确认是否已有同名文件,避免覆盖历史版本。
- 导出后立即校验格式,CSV 中若出现含逗号的字段必须加引号。
- 对外提供的报表只保留聚合字段,不含客户端地址等明细。
- 报表生成失败时不要覆盖上一版文件,保留最近一次成功结果并标注“数据延迟”。
- 导出前统一小数位与百分比写法,同一份报表里混用 0.05 与 5% 会让读者反复换算。
- 分发渠道与接收方固定下来,避免同一期报表出现多个版本被当作不同结果引用。