Gnuplot绘制每分钟日志状态出现频次折线图求助
Gnuplot 实现每分钟状态频次折线图方案
你原有脚本存在三个核心问题:未对OK/TEMP/PERM三类状态做分组统计、绘图类型用了箱型图而非折线、时间分桶后的计数逻辑没有匹配状态字段。以下是适配你Ubuntu 20.04上Gnuplot 5.2.8版本的可直接运行的实现:
完整可执行脚本
#!/bin/bash # 替换为你的实际日志文件路径 LOG_FILE="logoutcol" gnuplot <<-EOF reset set terminal png size 1200,600 font "Sans,10" set output "${LOG_FILE}.png" # 时间轴配置 set xdata time set timefmt "%H:%M" set format x "%H:%M" set xtics 60 # 每分钟显示一个X轴刻度,可按需调整间隔 set xlabel "时间" # Y轴配置 set yrange [0:*] set ylabel "状态出现频次" set ytics 1 set grid ytics linestyle 0 lc rgb "#eeeeee" # 通用配置 set datafile separator "," set key top left # 图例放在左上角 set binwidth = 60 # 分桶宽度60秒,即按分钟聚合 # 时间分桶函数:把任意时间对齐到所属整分钟 bin_time(t) = binwidth * floor(t/binwidth) # 计数判断函数:当前行状态匹配目标值时记1,否则记0 count_status(col, target) = (stringcolumn(col) eq target ? 1 : 0) # 跳过表头第一行,三类状态分别统计后绘制折线 plot "${LOG_FILE}" every ::1 using (bin_time(timecolumn(1, "%H:%M"))):(count_status(2, "OK")) smooth frequency with linespoints lw 2 pt 7 lc rgb "#2ecc71" title "OK", \ "" every ::1 using (bin_time(timecolumn(1, "%H:%M"))):(count_status(2, "TEMP")) smooth frequency with linespoints lw 2 pt 9 lc rgb "#f39c12" title "TEMP", \ "" every ::1 using (bin_time(timecolumn(1, "%H:%M"))):(count_status(2, "PERM")) smooth frequency with linespoints lw 2 pt 11 lc rgb "#e74c3c" title "PERM" EOF # 打开生成的图片,不需要可注释下面两行 shotwell "${LOG_FILE}.png" # rm "${LOG_FILE}.png"
关键逻辑说明
- 状态分组计数:通过
count_status函数判断每行第二列的状态值,匹配目标状态时返回1,否则返回0,配合smooth frequency就能自动按分钟分桶累加对应状态的出现次数 - 时间对齐:
bin_time函数把每条日志的时间戳对齐到所属整分钟,实现按分钟聚合的需求 - 折线配置:用
with linespoints同时绘制连线和数据点,三类状态分别用绿、橙、红三色区分,辨识度更高 - 表头跳过:
every ::1参数会跳过CSV第一行的TIME,STATUS表头,避免表头被当成无效数据解析报错
万行级日志适配说明
这个实现不需要提前对日志做预处理,Gnuplot原生流式读取处理1万行日志的速度在百毫秒级,完全不需要额外引入awk等工具做前置统计,直接运行脚本即可。
- 如果你的日志时间跨度超过1小时,只需要把
set timefmt和set format x的时间格式改成对应格式即可,比如跨天日志带日期就改成%Y-%m-%d %H:%M - 如果X轴刻度太密,可以把
set xtics 60改成set xtics 300,即每5分钟显示一个刻度
内容的提问来源于stack exchange,提问作者Alexander Sofianos
相关产品推荐
相关产品推荐

