Ваш код верен для долгосрочного применения.
Что происходит, вы используете код более одного раза в определенный день.
При первом запуске Ruby создает файл журнала "errors.log".
Когда день меняется, Ruby переименовывает файл в "errors.log.20130217".
Но как-то вы снова запустили код, возможно, вы используете два приложения (или процессы или рабочие или потоки), которые используют похожий код, и ваш регистратор увидел, что имя файла "errors.log.20130217" уже существовала.
Ваш регистратор не хочет замещать этот файл, но все-таки нужно переименовать «errors.log» на сегодняшний день, поэтому регистратор вместо этого создал другое имя файла «errors.log.20130217.1»
Для разрешите это, запустите свой код только один раз.
Если вы используете несколько приложений под названием «foo» и «bar», используйте имена файлов журналов, такие как «foo-errors.log» и «bar-errors.log». Или, если вы используете несколько работников, дайте каждому работнику собственное имя файла журнала (например, используя идентификатор процесса рабочего или индекс массива пула работников или, тем не менее, отслеживайте своих работников).
Если вы действительно хотите решить эту проблему с помощью регистратора Ruby, вам необходимо переопределить регистратор #shift_log_period, чтобы он не выбирал суффикс «.1». Вы можете подклассифицировать Logger и написать свой worn #shift_log_period, чтобы обнаружить, что существует существующий файл журнала для даты, и если это так, используйте его вместо того, чтобы выполнять переименование файла.
Это код, вызывающий его из регистратора:
def shift_log_period(period_end)
postfix = period_end.strftime("%Y%m%d") # YYYYMMDD
age_file = "#{@filename}.#{postfix}"
if FileTest.exist?(age_file)
# try to avoid filename crash caused by Timestamp change.
idx = 0
# .99 can be overridden; avoid too much file search with 'loop do'
while idx < 100
idx += 1
age_file = "#{@filename}.#{postfix}.#{idx}"
break unless FileTest.exist?(age_file)
end
end
@dev.close rescue nil
File.rename("#{@filename}", age_file)
@dev = create_logfile(@filename)
return true
Там нет решения (AFAIK) с помощью регистратора Ruby, с помощью встроенного в ротатор, управлять журналами, написанные несколькими приложениями (AKA рабочих , процессы, потоки) одновременно. Это связано с тем, что каждый из приложений получает собственный дескриптор файла журнала.
В качестве альтернативы, можно использовать любого из хороших бревен ротатора инструментов, такие как LogRotate как предложено пользователем Tin Man в комментариях вопроса: http://linuxcommand.org/man_pages/logrotate8.html
В общем, Logrotate будет вашим лучшим выбором ИМХО.
Похоже, вы создаете новый регистратор в своем файле окружения. Однако существует ли уже существующая? Кроме того, перезапустили ли вы приложение rails после создания новой строки Logger? – kobaltz
Трудно понять, что именно вы хотите, но вы взглянули на «[logrotate] (http://linuxcommand.org/man_pages/logrotate8.html)», который является стандартной частью * nix? Он может вращать журналы по разным критериям по-разному. –
@ kobaltz, да, у меня есть несколько процессов для доступа к одному журналу, и да, я перезапустил рельсы, но примечание плз, большинство моих журналов даже не в рельсах, а не в рубинах, Tin Man, это Я просто хочу иметь один файл журнала вместо нескольких журналов каждый день. –