Я помогаю поддерживать веб-сайт Rails. Он запускает JRuby 1.5.5, Rails 2.3.10, на машине Solaris Sparc. У меня проблема, связанная с протоколированием.
Чтобы остановить наши лог файлы, которые становятся слишком большими и заполняют диск, мы используем смену журнала, встроенную в класс Logger. В config/environment/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 октября (который, я считаю, является точкой, в которой лог повернулся), печатается снова и снова. Из прошлого опыта файл журнала будет продолжать заполнять этот повторяющийся контент до тех пор, пока диск не заполнится.
Является ли log shifting/Rails logging просто сломанным? (Нет ничего странного в использовании нашего лог файла: мы не делаем прямого ведения журнала, все это происходит только из Rails-фреймворка.) Очевидный следующий шаг - попробовать что-то вроде logrotate, но если Rails откажется закрыть старые файлы журналов и пишут хлам им навсегда, я подозреваю, что это не решит мою проблему (потому что журнал никогда не будет закрыт, и, следовательно, дисковое пространство никогда не восстанавливается).