如何通过日志查询Ubuntu 16.04上Zabbix服务器的离线时长?
如何计算Zabbix服务器的离线时长(Ubuntu 16.04环境)
嘿,这个场景我太熟了——电网拉胯+UPS扛不住整栋断电,想算Zabbix离线时长确实得从日志里挖细节。下面给你几个靠谱的方法,针对Ubuntu 16.04的环境:
方法1:从Zabbix自身日志获取(最准确)
如果Zabbix服务器是正常停机(哪怕是UPS耗尽后的 graceful 停止),日志里会明确记录启停时间,这是最准确的数据源。
单命令快速查询
先提取最后一次停机时间和对应的重启时间:
# 获取最后一次Zabbix停止的时间 STOP_TIME=$(grep "Zabbix server stopped." /var/log/zabbix/zabbix_server.log | tail -n1 | awk '{print $1, $2}') # 获取该停止事件之后的第一次Zabbix启动时间 START_TIME=$(grep -A 10000 "$STOP_TIME" /var/log/zabbix/zabbix_server.log | grep "Zabbix server started." | head -n1 | awk '{print $1, $2}') # 计算并输出易读的离线时长 echo "最后一次离线:从 $STOP_TIME 到 $START_TIME" echo "离线时长:$(( ($(date -d "$START_TIME" +%s) - $(date -d "$STOP_TIME" +%s)) / 3600 ))小时 $(( (($(date -d "$START_TIME" +%s) - $(date -d "$STOP_TIME" +%s)) % 3600) / 60 ))分钟 $(( ($(date -d "$START_TIME" +%s) - $(date -d "$STOP_TIME" +%s)) % 60 ))秒"
封装成脚本更方便
把下面的内容存成zabbix_down_time.sh,赋予执行权限后直接运行:
#!/bin/bash LOG_PATH="/var/log/zabbix/zabbix_server.log" # 检查日志文件是否存在 if [ ! -f "$LOG_PATH" ]; then echo "错误:Zabbix日志文件不存在,请检查路径是否正确" exit 1 fi # 获取最后一次停止和对应的启动时间 STOP_TIME=$(grep "Zabbix server stopped." "$LOG_PATH" | tail -n1 | awk '{print $1, $2}') START_TIME=$(grep -A 10000 "$STOP_TIME" "$LOG_PATH" | grep "Zabbix server started." | head -n1 | awk '{print $1, $2}') # 处理没有找到停止记录的情况(比如硬关机) if [ -z "$STOP_TIME" ]; then echo "未找到Zabbix正常停止的日志,可能是硬关机,请使用方法2" exit 0 fi # 转换为时间戳计算时长 STOP_TS=$(date -d "$STOP_TIME" +%s) START_TS=$(date -d "$START_TIME" +%s) DURATION=$((START_TS - STOP_TS)) # 输出结果 echo "=== Zabbix服务器离线时长统计 ===" echo "停止时间:$STOP_TIME" echo "启动时间:$START_TIME" echo "离线时长:$((DURATION/3600))小时 $(((DURATION%3600)/60))分钟 $((DURATION%60))秒"
方法2:系统日志兜底(硬关机场景)
如果是整栋断电导致服务器硬关机,Zabbix可能来不及写入停止日志,这时候就得靠系统日志来推算:
用syslog计算服务器离线时长
系统日志/var/log/syslog会记录系统启停的关键事件,我们可以取断电前的最后一条日志时间,和开机后的第一条日志时间来计算:
# 获取断电前最后一条系统日志的时间 LAST_LOG_TIME=$(tail -n1 /var/log/syslog | awk '{print $1, $2, $3}') # 获取开机后第一条系统服务启动的时间(以syslog服务启动为标志) FIRST_LOG_TIME=$(grep "systemd\[1\]: Started System Logging Service." /var/log/syslog | tail -n1 | cut -d: -f2- | awk '{print $1, $2, $3}') # 计算时长 echo "服务器离线时长(含系统启动时间):$(( ($(date -d "$FIRST_LOG_TIME" +%s) - $(date -d "$LAST_LOG_TIME" +%s)) / 3600 ))小时 $(( (($(date -d "$FIRST_LOG_TIME" +%s) - $(date -d "$LAST_LOG_TIME" +%s)) % 3600) / 60 ))分钟 $(( ($(date -d "$FIRST_LOG_TIME" +%s) - $(date -d "$LAST_LOG_TIME" +%s)) % 60 ))秒"
补充:查看系统重启时间
如果想快速确认服务器上次开机时间,可以用:
last reboot | head -n1
结合Zabbix启动日志里的时间,也能大致算出离线时长。
注意事项
- 日志轮转:Ubuntu 16.04默认用logrotate管理日志,旧日志会被压缩成
.gz文件,比如zabbix_server.log.1.gz,可以用zcat /var/log/zabbix/zabbix_server.log.1.gz | grep "Zabbix server stopped."读取压缩日志。 - 时间同步:确保服务器开启了NTP时间同步,否则日志时间不准会导致计算错误。
内容的提问来源于stack exchange,提问作者zDaniels
相关产品推荐
相关产品推荐

