Я помогаю поддерживать веб-сайт Rails. Он работает под управлением JRuby 1.5.5, Rails 2.3.10 на машине Solaris Sparc. У меня проблема, связанная с регистрацией.
Чтобы наши файлы журналов не стали слишком большими и не заполнили диск, мы используем сдвиг журнала, встроенный в класс Logger. В config/environments/production.rb имеем:
config.logger = Logger.new(config.log_path, 10, 100.megabyte)
Который должен чередовать файлы журналов, когда они достигают 100 мегабайт, и сохранять только 10 файлов.
Проблема двоякая: Rails неправильно ротирует журналы и держит открытым старый файл журнала для записи в него, но то, что он записывает, является просто повторяющимся содержимым нескольких запросов. Итак, если я сделаю ls -l log
, я увижу что-то вроде этого:
-rw-r--r-- 83040892 Oct 4 15:07 production.log
-rw-r--r-- 3303158664 Oct 4 15:07 production.log.0
-rw-r--r-- 104857616 Oct 2 23:13 production.log.1
-rw-r--r-- 104857618 Oct 1 17:12 production.log.2
Обратите внимание, что последний зацикленный журнал все еще открыт и все еще записывается (запуск pfiles
подтверждает, что сервер Rails все еще имеет три дескриптора файла для журнала). Обратите также внимание, что он достиг 3 гигабайт за два дня, тогда как обычно мы делаем 100 МБ в день. Это потому, что он полон повторных запросов. Я не могу легко вставить его сюда, но журнал заполнен одним и тем же блоком из 1000 строк запросов с 18:50 3 октября (я полагаю, что это точка, в которой журналы вращались), напечатанные снова и снова. Судя по прошлому опыту, файл журнала будет продолжать заполняться повторяющимся содержимым до тех пор, пока диск не заполнится.
Является ли смещение журнала / ведение журнала Rails просто сломанным? (Нет ничего странного в том, как мы используем лог-файл: мы не ведем прямой лог-файл, все это просто происходит из фреймворка Rails.) Очевидный следующий шаг — попробовать что-то вроде logrotate, но если Rails отказывается закрывать старые лог-файлы и постоянно пишет им мусор, я подозреваю, что это не решит мою проблему (потому что журнал никогда не будет закрыт, и, следовательно, место на диске никогда не восстановится).