部署自动化之后,更重要的是出问题时能快速定位。本文记录 ECS 服务器上日志管理和监控的实践经验。
一、日志查看
后端日志(systemd 服务)
前几篇文章用 systemd 管理了 Spring Boot 服务,systemd 自带日志管理:
# 实时查看日志
journalctl -u myapp -f
# 查看最近 100 行
journalctl -u myapp -n 100
# 查看今天的日志
journalctl -u myapp --since today
# 查看最近 1 小时
journalctl -u myapp --since "1 hour ago"
# 按关键字过滤
journalctl -u myapp | grep ERROR
Nginx 日志
Nginx 默认日志位置:
| 日志 | 路径 | 内容 |
|---|---|---|
| 访问日志 | /var/log/nginx/access.log | 每个 HTTP 请求 |
| 错误日志 | /var/log/nginx/error.log | 启动/运行错误 |
# 实时查看访问日志
tail -f /var/log/nginx/access.log
# 查看最近 50 条错误
tail -50 /var/log/nginx/error.log
二、日志轮转(防止磁盘写满)
日志不管理会越来越大,需要配置 logrotate。Nginx 通常已自带 /etc/logrotate.d/nginx:
# 检查 Nginx 日志轮转配置
cat /etc/logrotate.d/nginx
为应用日志配置轮转
创建 /etc/logrotate.d/myapp:
/opt/app/app.log {
daily # 每天轮转
rotate 7 # 保留 7 天
compress # 压缩旧日志
delaycompress # 延迟一天压缩
missingok # 日志不存在不报错
notifempty # 日志为空不轮转
copytruncate # 复制后清空,不中断写入
}
三、应用日志最佳实践
Spring Boot 默认输出到控制台,systemd 会自动收集。但生产环境建议输出到文件:
# application-prod.yml
logging:
file:
path: /opt/app/logs
name: /opt/app/logs/myapp.log
level:
root: WARN
com.yourcompany: INFO # 自己的包用 INFO
SLF4J 日志规范:
// 关键位置打日志
log.info("用户 {} 登录成功, IP: {}", username, ip);
log.warn("数据库连接池使用率: {}%", usage);
log.error("订单创建失败, 订单号: {}, 错误: ", orderId, e); // 异常对象放最后一个参数
四、阿里云云监控(免费)
阿里云自带免费的基础监控,不需要额外安装 Agent:
ECS 控制台监控
进入 ECS 控制台 → 实例 → 监控,可查看:
| 指标 | 说明 |
|---|---|
| CPU 使用率 | 持续超过 80% 需要扩容 |
| 内存使用率 | Java 应用的 OOM 隐患 |
| 磁盘使用率 | 超过 80% 时扩容/清理 |
| 网络流入/流出 | 带宽是否打满 |
| 磁盘 IOPS | 数据库所在盘的性能 |
设置告警规则
在云监控控制台 → 报警服务 → 创建报警规则:
| 监控项 | 阈值 | 说明 |
|---|---|---|
| CPU 使用率 | > 80% 持续 5 分钟 | 可能有死循环或需要扩容 |
| 内存使用率 | > 85% 持续 3 分钟 | Java OOM 前兆 |
| 磁盘使用率 | > 85% | 日志或数据写满磁盘 |
告警通知方式:短信、邮件、钉钉机器人。
五、磁盘空间监控
# 查看磁盘使用
df -h
# 查看目录大小
du -sh /opt/app/*
# 找出大文件
find / -type f -size +100M 2>/dev/null
写一个简单的磁盘检查脚本 /opt/scripts/check-disk.sh:
#!/bin/bash
THRESHOLD=85
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "磁盘使用率: ${USAGE}%, 超过阈值 ${THRESHOLD}%" >&2
# 可以在这里调用钉钉/企业微信 webhook 通知
fi
crontab 定期检查:
0 */2 * * * /opt/scripts/check-disk.sh # 每两小时检查一次
六、进程与端口监控
# 检查进程是否存活
systemctl is-active myapp # 返回 active 或 inactive
# 检查端口是否监听
ss -tlnp | grep 8080
# 检查内存使用
ps aux | grep java
# 综合检查脚本
#!/bin/bash
if ! systemctl is-active --quiet myapp; then
echo "后端服务已停止,尝试重启..."
systemctl restart myapp
fi
七、错误快速排查流程
出问题时按以下顺序排查:
1. 服务是否在运行? → systemctl status myapp
2. 端口是否在监听? → ss -tlnp | grep 8080
3. 日志有什么错误? → journalctl -u myapp -n 50 | grep ERROR
4. 磁盘满了吗? → df -h
5. 内存够吗? → free -h
6. CPU 正常吗? → top
7. 外网能通吗? → curl http://localhost:8080/
总结
日志管理的核心:systemd 日志 + 应用文件日志 + logrotate 轮转。
监控的核心:云监控告警 + 磁盘检查 + 服务存活检查。
日志让你知道出了什么问题,监控让你在用户发现之前就动手。