我们有一个运行在Linux上的apache服务器写入日志文件,这个日志文件变得非常大(access_log)。 我们的服务器将开始用尽空间。 有没有办法删除或截断文件,而无需重新启动服务器(我们不希望任何停机时间)。
如何重置您的日志文件
迟早你会想重置你的日志文件( access_log和error_log ),因为它们太大了,或者是你不需要的旧信息。
access_log通常每增加1万个请求就会增长1Mb。
大多数人第一次尝试replace日志文件只是移动日志文件或删除日志文件。 这不起作用。
Apache将继续以日志文件移动之前的相同偏移量写入日志文件。 这将导致创build一个新的日志文件,其大小与旧的一样大,但现在包含数千(或数百万)个空字符。
正确的过程是移动日志文件,然后通知Apache告诉它重新打开日志文件。
Apache使用SIGHUP (-1)信号发送信号。 例如
mv access_log access_log.old 杀-1猫`httpd.pid`
注意: httpd.pid是一个包含Apache httpd守护进程进程ID的文件,Apache将其保存在与日志文件相同的目录中。
许多人使用这种方法来每晚或每周replace(和备份)他们的日志文件。
日志轮换是一个长期的解决scheme,但你的直接问题的答案是截断文件是这样的:
sudo cat /dev/null > /var/log/httpd/access_log
我假设你没有以root身份login,并假设你的日志文件的位置,但你应该能够根据需要调整命令,并快速截断一个打开的日志文件不接触你正在运行的Apache进程。
清零日志文件…
# :>filename
如果要截断/归零没有写权限的日志文件,可以这样做
sudo truncate -s0 logfile
只需要创build第一个$ cat filename >bkp_filename比创build“文件名”副本要比原始文件如$ >filename名将减less到零大小,现在使zip到bkp_filename像$ gzip bkp_filename这样会提供更多的大小你的挂载点现在是绿色的
尝试使用logrotate
prerotate和正postrotate期间运行指令的function copytruncate使您可以复制现有的文件,然后截断它。 如果需要,可以将副本移动到另一个存储器,如hadoop,s3进行备份 /etc/cron.hourly/logrotate设置一个cron,例如/usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/logger 更多信息man logrotate