Правильное использование Log4r в Ruby Application - PullRequest
7 голосов
/ 18 марта 2010

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

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

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

Спасибо!

Ответы [ 2 ]

14 голосов
/ 29 декабря 2010

Я поддерживаю 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 для того, о чем вы просите.

12 голосов
/ 18 марта 2010

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

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 на диске.

...