哪些日志需要定期关注?
必须关注的"大户"日志(最容易撑爆磁盘)
| 日志文件 | 位置 | 为什么容易膨胀 |
|---|---|---|
| 系统日志 | /var/log/syslog(Ubuntu) | |
/var/log/messages(CentOS ) | 记录所有系统事件,长期不清理可达几十GB | |
| 安全认证日志 | /var/log/auth.log(Ubuntu) | |
/var/log/secure(CentOS) ) | 暴力破解记录及登录信息全在里面 | |
| Nginx 访问日志 | /var/log/nginx/access.log | 高流量网站几天就能到几GB |
| Nginx 错误日志 | /var/log/nginx/error.log | 持续记录错误 |
| Docker 容器日志 | /var/lib/docker/containers/*/*.log | 容器 stdout/stderr 输出,默认不限制大小 |
| 应用日志 | 你的 Gin 应用写的日志 | 如果没有轮转,会越来越胖 |
次要关注的日志
| 日志文件 | 位置 | 说明 |
|---|---|---|
| 邮件日志 | /var/log/maillog | 如果没开邮件服务可以忽略 |
| Cron 日志 | /var/log/cron | 定时任务日志 |
| YUM/DNF 日志 | /var/log/yum.log | 软件包安装记录 |
| Journal 日志 | journalctl 管理的二进制日志 | systemd 的日志,默认会占用一部分磁盘 |
绝对不要直接 rm 删除日志文件!
这是运维新手最容易犯的一个致命错误。
❌ 错误做法:
sudo rm /var/log/messages
sudo rm /var/log/secure
后果:
- 日志不再写入 —— 因为文件句柄被删除了,进程还在往"已删除的文件"写,你在新路径上看不到任何日志
- 磁盘空间不释放 ——
df -h显示磁盘还是满的,因为被删除的文件句柄还在被占用 - 需要重启服务才能恢复 —— 要重启 rsyslogd、Nginx 等服务才能重新创建日志文件
正确的做法:
# 清空文件内容,而不是删除文件
sudo truncate -s 0 /var/log/messages
# 或者
sudo cat /dev/null > /var/log/messages
# 或者
sudo echo "" > /var/log/messages
这样清空后,文件还在,inode 没变,进程可以继续往这个文件写入。
正确的日志管理方案(三步走)
方案一:使用 logrotate(最推荐,自动轮转)
Linux 系统自带 logrotate,它会自动轮转、压缩、删除旧日志。
查看现有配置:
cat /etc/logrotate.conf
ls /etc/logrotate.d/
为应用日志添加轮转配置:
sudo vim /etc/logrotate.d/myapp
写入内容示例(以你的 Gin 应用为例):
/srv/alice/docker/myproject/gin/logs/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近 7 天的日志
compress # 轮转后的日志压缩
delaycompress # 延迟一轮再压缩(方便排查)
missingok # 如果文件不存在也不报错
notifempty # 空文件不轮转
create 0640 alice alice # 新日志文件的权限和所有者
copytruncate # 复制后截断原文件(对正在运行的程序友好)
}
测试配置是否有效:
sudo logrotate -d /etc/logrotate.d/myapp # -d = dry run,只测试不执行
sudo logrotate -vf /etc/logrotate.d/myapp # -f = force,强制执行一次
Nginx 日志的轮转(通常系统已经有):
cat /etc/logrotate.d/nginx
如果没有,手动创建:
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 nginx root
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
方案二:Docker 容器日志的轮转
Docker 容器默认的日志驱动(json-file)不限制大小,这是个大坑。
全局配置(修改 Docker daemon 配置):
sudo vim /etc/docker/daemon.json
添加日志轮转配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
重启 Docker 使配置生效:
sudo systemctl restart docker
⚠️ 注意: 这个配置只对新创建的容器生效,已有容器需要重建。
针对单个容器在 docker-compose.yml 中配置:
services:
gin:
image: your-gin-image
logging:
driver: 'json-file'
options:
max-size: '100m'
max-file: '5'
方案三:手动清理(应急用)
如果发现磁盘快满了,临时清理:
# 1. 查看磁盘使用情况
df -h
# 2. 找出占用最大的日志文件
sudo du -sh /var/log/* | sort -rh | head -10
# 3. 安全地清空大文件
sudo truncate -s 0 /var/log/secure
sudo truncate -s 0 /var/log/messages
# 4. 清理旧的压缩日志(*.gz)
sudo find /var/log -name "*.gz" -mtime +30 -delete # 删除 30 天前的压缩日志
# 5. 清理 Docker 占用的空间
docker system prune -f # 清理无用容器、镜像、网络
docker volume prune -f # 清理无用 volume
实战检查清单
# 1. 查看磁盘使用情况
df -h
# 2. 找出占用空间最大的目录
sudo du -sh /* 2>/dev/null | sort -rh | head -10
# 3. 查看日志目录大小
sudo du -sh /var/log/
# 4. 查看 Docker 占用
docker system df
# 5. 查看 journal 日志大小
sudo journalctl --disk-usage
# 6. 清理 journal 日志(保留最近 7 天)
sudo journalctl --vacuum-time=7d
总结
| 日志类型 | 清理方式 | 频率 |
|---|---|---|
| 系统日志 | logrotate(自动) | 每天/每周 |
| Nginx 日志 | logrotate(自动) | 每天 |
| Gin 应用日志 | 自建 logrotate 配置 | 每天 |
| Docker 容器日志 | daemon.json 配置轮转 | 容器运行时自动 |
| Journal 日志 | journalctl --vacuum-time | 每月手动或 cron |
| 临时应急 | truncate -s 0 | 磁盘快满时 |
一句话记住:
不要
rm日志文件!用truncate -s 0清空,或者配置好logrotate让它自动处理。 磁盘满之前就做好日志轮转,不要等到报警了再救火。