2013-02-17 2 views
5

Я использую рубин стандартный регистратор, я хочу вращения ежедневно один, так что в моем коде у меня есть:Создание только один журнал каждый день, используя Ruby, стандартный Logger

Logger.new("#{$ROOT_PATH}/log/errors.log", 'daily') 

Он прекрасно работает, но он создал два файлы errors.log.20130217 и errors.log.20130217.1.

Как я могу заставить его создать только один файл в день?

+2

Похоже, вы создаете новый регистратор в своем файле окружения. Однако существует ли уже существующая? Кроме того, перезапустили ли вы приложение rails после создания новой строки Logger? – kobaltz

+1

Трудно понять, что именно вы хотите, но вы взглянули на «[logrotate] (http://linuxcommand.org/man_pages/logrotate8.html)», который является стандартной частью * nix? Он может вращать журналы по разным критериям по-разному. –

+0

@ kobaltz, да, у меня есть несколько процессов для доступа к одному журналу, и да, я перезапустил рельсы, но примечание плз, большинство моих журналов даже не в рельсах, а не в рубинах, Tin Man, это Я просто хочу иметь один файл журнала вместо нескольких журналов каждый день. –

ответ

11

Ваш код верен для долгосрочного применения.

Что происходит, вы используете код более одного раза в определенный день.

При первом запуске 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 будет вашим лучшим выбором ИМХО.

+0

Человек, которым вы абсолютно правы здесь, я использую один и тот же журнал из нескольких рабочих, и иногда я перезапускаю процессы, но могу больше объяснить prefix "" # {$ ROOT_PATH} /log/myapp-errors.log "u предложил? спасибо alot для ur help –

+0

Добро пожаловать. Я добавил дополнительную информацию для вас. – joelparkerhenderson

+0

У меня возникла проблема, что я не могу перезапустить приложение на ежедневной основе, и мне нужно ежедневно создавать файл журнала. Есть ли какое-либо решение для этого в рубине или мне нужно будет использовать параметр logrotate? –