当磁盘空间不足,日志文件占用了几 GB,而磁盘空间又不够时,在不丢失任何日志的情况下最好的处理方案是什么?
我尝试过的方法是 mv 日志文件并压缩,但这会在 lsof 中显示为已删除,这可能会在将来出现问题。
可能对日志文件进行 gzip 压缩,然后 kill -1 进程。但是,这是您在生产服务器上为 httpd 和 mysql 等服务执行的操作吗?
谢谢。Ob
答案1
如果存储空间已满,则压缩将不起作用,因为没有空间存放临时文件。
将日志复制到其他存储。 scp -r /var/log/ otherhost:
查看并删除旧日志文件。 find /var/log -mtime +7
如果有必要,扩展文件系统。
压缩一些大文件。重新加载服务以打开新的日志文件。gzip /var/log/httpd/access_log ; systemctl reload httpd.service
执行 logrotate 或等效脚本来自动管理这些。通常的模式是将当前文件移动到新名称,然后重新打开新的日志文件。
考虑实施远程日志服务器并将日志从主机发送出去。
是否向服务发送信号或以其他方式重新加载它取决于您。当然,如果您感到紧张,您可以在测试系统上尝试。
如果你不告诉服务打开新文件,还有另一个选项:就地截断。 cp /dev/null file.log
或 logrotate 选项copytruncate
。但是,请注意 lograte 手册页中关于这不是原子的警告:
请注意,复制文件和截断文件之间的时间间隔非常小,因此某些日志数据可能会丢失。
答案2
对于 Apache 使用 USR1 信号:
killall -USR1 httpd
对于 mysql flush logs 命令:
mysqladmin 刷新日志
但使用 logrotate 来轮换日志可能更好,它通常附带 apache/mysql 的配置,基本上可以帮你完成这项工作并对日志进行 gzip 压缩。这是生产服务器上的常见做法。