Правильное использование Log4r в Ruby Application
Я, должно быть, действительно упускаю что-то очевидное, но у меня возникают проблемы с общим использованием Log4r в моем приложении Ruby. Я могу войти без проблем, но накладные расходы кажутся неуклюжими при настройке. Я в основном передаю полный путь к имени файла, чтобы войти в каждый класс в моем приложении. Сценарий ruby, который вызывается, извлекает файл журнала из одного из аргументов в ARGV, который затем передается и устанавливается в каждом классе, который я вызываю в ruby. В каждом классе я использую patternFormatter, чтобы вставить имя класса / файла в инструкцию log.
Есть ли лучший способ сделать эту работу? Такое чувство, что независимо от того, о чем я думаю, потребуется передать что-то каждому классу в моем приложении ruby. Вместо этого я мог бы установить файл журнала в файле конфигурации yaml, но тогда я бы передавал файл конфигурации каждому классу.
Любой совет? Если это не имеет смысла, я мог бы попытаться опубликовать более конкретные примеры кода, чтобы объяснить, что я имею в виду.
Спасибо!
2 ответа
Хм, любая причина, почему вы не создаете экземпляр 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
на диске.
Я поддерживаю log4r,
Для отдельных сценариев (разных файлов.rb) вы могли бы подойти к этому несколькими различными способами (подгонка, я знаю), во-первых, помните, что описываемые здесь функции доступны в>= 1.1.4.
Один из способов - установить разные строки PatternFormatter для каждого скрипта (если вы создаете файл конфигурации yaml или xml, вы можете указать разные шаблоны для каждого имени класса).
Другим способом было бы использовать один из GDC, NDC или MDC в PatternFormatter.
GDC установит "Глобальный контекст диагностики", то есть это значение, которое доступно всем потокам, выполняющим сценарий. Вы можете использовать его, поместив%g в шаблон и установив значение через GDC.set(String) для получения более подробной информации, см. http://log4r.rubyforge.org/manual.html
NDC и MDC являются вложенными и отображенными диагностическими контекстами соответственно. Шаблон для них - использовать%x и%X{Symbol|Object} и устанавливать их через NDC.set(String) и MDC.put(Symbol|Object, Object)
Еще один способ - использовать шаблон%t, который выводит имя файла и номер строки, где был сделан вызов.
Компромисс между каждым из этих методов заключается в том, что они все более дороги в использовании ресурсов процессора. Я склонен сначала использовать GDC для того, о чем вы просите.