运维VPS一段时间后,你会发现磁盘空间被日志吃掉了不少。更严重的是,如果服务器被入侵,攻击者第一件事就是清理访问痕迹。作为服务器管理员,掌握日志清理的正确方法,既是为了释放磁盘,也是安全响应流程里绕不开的一环。
本文不讲虚的,直接列出VPS环境下清理日志的常用操作。所有命令在Ubuntu、Debian、CentOS上通用。
直接清空日志文件内容
最粗暴的方法是用`truncate`命令把文件大小变成0。文件还在,权限不变,但里面没东西了。
truncate -s 0 /var/log/syslog
或者用重定向:
cat /dev/null > /var/log/auth.log
这种方式适合处理正在被服务写入的日志文件。注意不要直接`rm`删除,因为某些进程会一直持有文件句柄,删除后新日志不会继续写入。
按时间删除旧日志
很多时候你只想保留最近7天的日志。用`find`配合`mtime`参数就能筛出来。
find /var/log -name "*.log" -mtime +7 -delete
`-mtime +7`代表修改时间在7天前的文件。先不加`-delete`跑一遍看看匹配结果,确认无误再删。
针对Nginx访问日志:
find /var/log/nginx -name "access.log*" -mtime +30 -exec rm {} \;
使用logrotate自动轮转
logrotate是系统自带的日志管理工具,比手删靠谱。配置文件在`/etc/logrotate.d/`下。
看一个典型配置,针对自定义应用`/var/log/myapp/*.log`:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
解释一下参数:
- `daily`:每天轮转一次
- `rotate 7`:保留7个归档文件
- `compress`:压缩旧日志
- `delaycompress`:上上次的才压缩,上次的暂时不压(配合postrotate常用)
- `postrotate`:轮转后告诉服务重新打开日志文件
手动执行logrotate看效果:
logrotate -f /etc/logrotate.d/myapp
清理systemd journal日志
使用systemd的系统,journal会吃掉/var/log/journal目录几GB的空间。查看当前占用:
journalctl --disk-usage
限制日志最大体积为500MB:
journalctl --vacuum-size=500M
或者只保留最近两周:
journalctl --vacuum-time=14d
想永久生效,修改`/etc/systemd/journald.conf`:
SystemMaxUse=500M
MaxFileSec=14day
然后重启服务:
systemctl restart systemd-journald
清理Web服务器和数据库慢日志
这部分经常被忽略。以MySQL慢查询日志为例,路径一般在`/var/log/mysql/slow.log`。
禁用或轮转慢日志配置(`/etc/mysql/my.cnf`):
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 0
清空后让MySQL重新打开文件:
mysqladmin flush-logs
Nginx访问日志如果不需要长期保留,可以直接关闭记录。编辑站点配置,把`access_log off;`加上。
安全注意事项
清理日志时有两个雷区要避开。
第一,不要在生产环境直接`rm -rf /var/log/*`。这会导致依赖日志目录的服务启动失败,而且某些服务会在目录不存在时停止写入。
第二,如果VPS是多人共用或者需要合规审计,日志保留期限可能需要遵守当地法律或行业规范。金融、医疗类业务通常要求至少保留180天。
第三,攻击者清理日志后通常会留下空文件。如果你发现某个日志文件大小为0,但修改时间却很新,这可能是入侵迹象。对比同时间段的其他服务器统计就能发现问题。
写一个清理脚本
把常用操作集成到一起,做成cron任务每周跑一次。
#!/bin/
# VPS日志清理脚本
# 清理syslog和auth日志
truncate -s 0 /var/log/syslog
truncate -s 0 /var/log/auth.log
# 清理7天前的apt历史日志
find /var/log/apt -name "*.log" -mtime +7 -delete
# 清理journal到300M
journalctl --vacuum-size=300M
# 重载rsyslog
systemctl reload rsyslog
echo "日志清理完成于 $(date)" >> /var/log/logclean.log
保存为`/usr/local/bin/cleanlogs.sh`,加执行权限。然后添加到crontab:
0 3 * * 0 /usr/local/bin/cleanlogs.sh >/dev/null 2>&1
每周日凌晨3点自动运行。
日志清理不是删完就没事了。日常要养成两个习惯:一是用logrotate统一管理轮转策略,二是定期检查磁盘占用高的日志文件。对于敏感业务,考虑把日志通过rsyslog远程发送到另一台VPS保存,本地只保留少量。这样即使主服务器被攻击,日志证据还在。
相关内容
