gunicorn进程持有对logrotated文件的引用,导致磁盘空间用尽

时间:2019-04-10 07:28:48

标签: python gunicorn logrotate

我正在使用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文件中,并且释放了磁盘空间。

1 个答案:

答案 0 :(得分:0)

您正在寻找copytruncate选项。这就是文件系统的工作方式。当进程为文件打开了描述符后,您将删除该文件(例如,从命令行中删除),描述符将仍然在内存中可用(通过inode)。因此copytruncate只会复制您的日志文件,而当前打开的日志文件(与gunicor连接)将截断为0。