2010-03-18 1 views
7

Мне действительно нужно упустить что-то очевидное, но у меня проблемы с общим использованием Log4r в моем приложении Ruby. Я могу регистрироваться без проблем, но накладные расходы кажутся неуклюжими, как у меня есть настройка. Я в основном передаю полный путь к имени файла для входа в каждый класс в моем приложении. Сценарий ruby, который называется, вытаскивает файл журнала из одного из аргументов в ARGV, который затем передается и устанавливается в каждом классе, который я вызываю в ruby. В каждом классе я использую patternFormatter для вставки имени класса/файла в оператор журнала.Правильное использование Log4r в Ruby Application

Есть ли лучший способ сделать эту работу? Мне кажется, что независимо от того, что я думаю, это потребует, чтобы что-то было передано каждому классу в моем рубиновом приложении. Вместо этого я мог бы установить файл журнала в конфигурационном файле yaml, но затем я буду передавать файл конфигурации и каждому классу.

Любые советы? Если это не имеет смысла, я мог бы попытаться опубликовать некоторые более конкретные образцы кода, чтобы еще больше объяснить, что я имею в виду.

Спасибо!

ответ

12

Хмм, любая причина, по которой вы не создаете экземпляр класса Log4r::Logger в начале вашего скрипта и передаете экземпляр вокруг? Вы даже не должны передать его вокруг, вы всегда можете получить его по имени из Logger класса:

run.rb:

require 'log4r' 
require 'class_a' 

logger = Log4r::Logger.new('test') 
logger.outputters << Log4r::Outputter.stdout 
logger.outputters << Log4r::FileOutputter.new('logtest', :filename => 'logtest.log') 
logger.info('started script') 
a = A.new 
a.do_something 
logger.info('finishing') 

class_a.rb:

class A 
    def do_something 
    logger = Log4r::Logger['test'] 
    logger.info('in do_something') 
    puts 'hi!' 
    end 
end 

и когда вы запускаете run.rb вы получаете:

$ ruby run.rb 
INFO test: started script 
INFO test: in do_something 
hi! 
INFO test: finishing 

и файл журнала с именем logtest.log на диске.

+0

Я не могу сделать эту работу. Вызов Logger ['mylog'] в другом файле .rb возвращает nil. – Spencer

+0

И как я могу сообщить Logger, в какой файл выйти? – Spencer

+0

Взгляните на приведенный выше пример выше. Что вы имеете в виду, когда говорите «другой файл .rb»? –

13

Я сопровождающим log4r,

Для отдельных сценариев (различные .RB файлов), вы могли бы подойти к этому в несколько различных способов (фитинговых, я знаю), во-первых, иметь в виду, что функции I Покрытие здесь доступно в> = 1.1.4.

Одним из способов было бы установить другую строку PatternFormatter для каждого скрипта (если вы создаете файл конфигурации yaml или xml, вы можете указать разные шаблоны для каждого имени класса).

Другим способом было бы использовать один из GDC, NDC или MDC в PatternFormatter.

GDC установит «Глобальный контекст диагностики», то есть это значение, доступное из всех потоков, выполняющих скрипт. Вы можете использовать его, поместив% g в шаблон и установив значение через GDC.set (String) для получения более подробной информации: http://log4r.rubyforge.org/manual.html

НДЦ и MDC являются вложенными и сопоставленными диагностическими контекстами соответственно. Шаблон для них состоит в использовании% x и% X {Symbol | Object} и для их установки через NDC.set (String) и MDC.put (Symbol | Object, Object)

Еще один способ - используйте шаблон% t, который печатает имя файла и номер строки, где был выполнен вызов.

Компромисс между каждым из этих методов заключается в том, что они постепенно дороже в использовании ресурсов ЦП. Я склонен сначала использовать GDC для того, что вы просите.

+0

Не могли бы вы показать пример? (Ссылка, которую вы предоставили, мертва) – Arafangion

Смежные вопросы