我正在使用logrotate旋转Gunicorn访问/错误日志。
{
su root root
missingok
compress
dateext
dateformat .%Y%m%d
notifempty
sharedscripts
postrotate
# Send USR1 signal to the gunicorn master, which will cause it to reopen log files.
# http://docs.gunicorn.org/en/latest/deploy.html#logging
/bin/kill -USR1 $(cat /var/run/xxxx/api.pid 2>/dev/null) 2> /dev/null || true
endscript
}
日志将正确旋转和压缩,并创建一个新的日志文件。但是gunicorn不会释放指向已删除日志文件的指针,而是继续写入该日志文件。因此,磁盘上的文件空间不会释放,并且日志行也会丢失。
我可以看到带有lsof的条目
gunicorn 22284 root 9w REG 252,1 43263609 0 117968 /usr/cachelogic/log/gunicorn_unapi_access.log-20190410 (deleted)
如果我重新启动gunicorn服务,将释放文件空间,并且该过程还将日志写入新文件。但是写入已删除文件的旧日志将丢失。
我想解决logrotate问题,而无需重新启动服务。如何确保将日志写入到新日志文件而不是logrotated文件中,并且释放了磁盘空间。
答案 0 :(得分:0)
您正在寻找copytruncate
选项。这就是文件系统的工作方式。当进程为文件打开了描述符后,您将删除该文件(例如,从命令行中删除),描述符将仍然在内存中可用(通过inode
)。因此copytruncate
只会复制您的日志文件,而当前打开的日志文件(与gunicor连接)将截断为0。