Процесс gunicorn содержит ссылку на файлы с логротацией, что приводит к нехватке места на диске

Я использую logrotate для ротации журналов доступа/ошибок пушки.

{
  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 без перезапуска службы. Как убедиться, что журналы записываются в новый файл журнала, а не в файл с ротацией журналов, и освобождается место на диске.


person Anbarasan    schedule 10.04.2019    source источник


Ответы (1)


Вы ищете вариант copytruncate. Так работает файловая система. Когда процесс открыл дескриптор файла и вы удалите этот файл (например, из командной строки), дескриптор все еще будет доступен в памяти (через inode). Таким образом, copytruncate просто скопирует ваш файл журнала, а текущий открытый файл журнала (связанный с gunicor) будет обрезан до 0.

person pawelbylina    schedule 10.04.2019
comment
с copytruncate что произойдет в случае, если по какой-то причине копирование будет медленным (огромный размер файла / тяжелый дисковый ввод-вывод), то промежуточные строки журнала будут потеряны или они также будут скопированы до усечения. - person Anbarasan; 10.04.2019
comment
Хм, вы правы, некоторые логи могут быть утеряны. Я вижу, что gunicorn должен заново открыть все файлы журналов через сигнал USR1. Может, попробовать послать USR1 и детям, чтобы проверить поведение? В этом поведении была ошибка github.com/benoitc/gunicorn/issues/345. Какую версию гуникорна вы используете? - person pawelbylina; 10.04.2019
comment
Я использую gunicorn 19.4.5. я проверю отправку USR1 детям и посмотрю. - person Anbarasan; 10.04.2019