监控与日志
监控和日志的目标不是“装更多面板”,而是让你在出问题时能更快回答三个问题:哪里坏了、什么时候开始坏、影响范围有多大。
推荐落地顺序
- 先有最基础的 uptime 监控
- 再补关键服务日志查看方式
- 再看进程守护、重启和告警
- 最后才是仪表盘、聚合和更复杂的可观测性栈
系统监控
htop / btop
# 安装
apt install htop -y
# 或更现代的 btop
apt install btop -y
# 运行
htop
btop
Glances
跨平台系统监控,支持 Web 界面。
pip install glances
# 终端模式
glances
# Web 模式
glances -w
# 访问 http://localhost:61208
Uptime 监控
Uptime Kuma
自托管的监控工具,支持 HTTP、TCP、Ping 等多种监控方式。
# docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data
docker compose up -d
# 访问 http://localhost:3001
功能:
- HTTP/HTTPS、TCP、Ping、DNS 监控
- 通知:Telegram、Discord、邮件、Webhook
- 状态页面
- 多语言支持
日志管理
journalctl(systemd)
# 查看服务日志
journalctl -u nginx -f # 实时跟踪
journalctl -u nginx --since today
journalctl -u nginx --since "2026-02-01" --until "2026-02-27"
# 查看系统日志
journalctl -p err # 只看错误
journalctl --disk-usage # 日志占用空间
journalctl --vacuum-size=500M # 清理到 500M
日志文件常用操作
# 实时查看
tail -f /var/log/nginx/access.log
# 搜索错误
grep -i error /var/log/syslog
# 统计访问 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head 20
# 按时间过滤
awk '/27\/Feb\/2026/' /var/log/nginx/access.log
Loki + Grafana
轻量级日志聚合方案。
# docker-compose.yml
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
volumes:
- ./loki-data:/loki
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
进程管理
PM2(Node.js)
npm install -g pm2
pm2 start app.js --name myapp
pm2 list # 查看进程
pm2 logs myapp # 查看日志
pm2 monit # 监控面板
pm2 restart myapp # 重启
pm2 stop myapp # 停止
pm2 delete myapp # 删除
# 开机自启
pm2 startup
pm2 save
Supervisor(Python/通用)
apt install supervisor -y
; /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/usr/bin/python3 /opt/app/main.py
directory=/opt/app
user=www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/myapp.log
stderr_logfile=/var/log/myapp-error.log
supervisorctl reread
supervisorctl update
supervisorctl status
告警
简单脚本告警
#!/bin/bash
# check-disk.sh
THRESHOLD=90
USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-d "chat_id=<CHAT_ID>&text=⚠️ 磁盘使用率 ${USAGE}%"
fi
配合 cron 定时执行:
# 每小时检查一次
0 * * * * /opt/scripts/check-disk.sh
参考链接
建议优先监控的内容
- 站点是否可访问
- 磁盘空间
- CPU / 内存异常
- 关键进程是否退出
- 证书有效期
常见问题
有日志,但不知道从哪看起
先看时间点,再看对应服务,再看错误级别。不要一上来全量翻几十万行日志。
服务偶尔挂掉,但平时看不出来
这正是 uptime 监控和告警的价值。没有外部监控时,很多间歇性故障会被错过。
要不要一开始就上完整 ELK / Loki 栈
不建议。先把最小可用监控做起来,再看是否真的有聚合需求。
- Uptime Kuma — 自托管监控
- Grafana — 可视化平台
- PM2 — Node.js 进程管理
- Glances — 系统监控
- Docker Compose 常用配置 — 如果你准备把监控工具作为自建服务跑起来