跳到主要内容

哪些日志需要定期关注?

必须关注的"大户"日志(最容易撑爆磁盘)

日志文件位置为什么容易膨胀
系统日志/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

后果:

  1. 日志不再写入 —— 因为文件句柄被删除了,进程还在往"已删除的文件"写,你在新路径上看不到任何日志
  2. 磁盘空间不释放 —— df -h 显示磁盘还是满的,因为被删除的文件句柄还在被占用
  3. 需要重启服务才能恢复 —— 要重启 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 让它自动处理。 磁盘满之前就做好日志轮转,不要等到报警了再救火。