Как я могу определить свои собственные уровни в log4r без конфликта с другими log4r-регистраторами?

Я могу определить свои собственные уровни журнала с log4r:

require 'log4r'
require 'log4r/configurator'

# This is how we specify our levels
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"

log = Log4r::Logger.new('custom levels')
p log.levels  #-> ["ALL", "Foo", "Bar", "Baz", "OFF"]
log.add Log4r::StdoutOutputter.new('console')

puts log.foo? #-> true
log.foo "This is foo 1"

log.level = Log4r::Bar
puts log.foo? #->false
log.foo "This is foo 2"

Документация log4r гласит:

Кроме того, пользовательские уровни должны быть установлены до того, как что-либо еще будет сделано с Log4r, иначе будут загружены уровни по умолчанию.

Это ограничение является источником двух проблем:

  • Установка новых уровней с Log4r::Configurator.custom_levels работает только, если не определен регистратор.
  • Если я создаю еще один логгер после определения своих собственных уровней, я снова получаю пользовательские уровни.

Проблема 1:

Пример:

require 'log4r'
require 'log4r/configurator'

#Create a dummy logger
Log4r::Logger.new('dummy')

# Define new levels -> does not work after creation of another logger.
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"
log = Log4r::Logger.new('custom levels')
p log.levels  #-> ["ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF"]

Пользовательские уровни не используются.

Проблема 2

Если я определю свои собственные уровни, у меня не будет возможности вернуться к значениям по умолчанию.

Пример:

require 'log4r'
require 'log4r/configurator'

# Define customer levels
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"
Log4r::Logger.new('dummy with custom levels')

#Reset to standard levels ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"] <- this does not work
Log4r::Configurator.custom_levels( *Log4r::Log4rConfig::LogLevels )
log2 = Log4r::Logger.new('log')
p log2.levels #-> ["ALL", "Foo", "Bar", "Baz", "OFF"], but I wanted ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"]

Фон:

Я хочу создать регистратор со своими уровнями, похожими на Apache:DEBUG INFO NOTICE WARN ERROR CRIT ALERT EMERG,

Когда я это делаю, я получаю две проблемы:

  • Если другое приложение также использует log4r, это приложение не имеет фатального уровня. Это может быть решено, если я добавлю фатальный уровень в моем приложении.
  • Если другое приложение загружается перед моим приложением и создает регистратор, мое приложение не будет выполнено, потому что уровни моего клиента недоступны.

Мой вопрос:

Как я могу создать регистратор с настроенными уровнями журналов и без побочных эффектов для других регистраторов?

1 ответ

Решение

Пользовательские уровни охватывают весь процесс, и вы не можете сбросить их после того, как они уже установлены. Но может быть какой-то способ достичь того, что вы хотите.

Проблема 1

Предыдущие пользовательские уровни должны быть установлены по причине, а методы регистратора и методы вывода создаются во время настройки пользовательских уровней, поэтому вы должны быть осторожны, если собираетесь удалить некоторые из пользовательских уровней, которые могут вызвать непредвиденные ошибки.

Тем не менее, есть обходной путь для сброса пользовательских уровней из моего форка Log4r, и это для целей тестирования. (Этот метод сбрасывает log4r в исходное состояние, стирает все существующие средства записи и вывода)

Проблема 2

Есть два решения для разрешения конфликтов:

  • Определите все пользовательские уровни до того, как это сделают другие модули. И вы должны включить все пользовательские уровни. например ['Foo', 'Bar', 'Bing', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']
  • Если вы не можете сделать это раньше, чем другие модули, используйте метод выше для сброса log4r и переопределения пользовательских уровней, а также при необходимости загрузите конфигурации из других модулей
  • Используйте следующие псевдонимы и измените конфигурацию log4r соответствующим образом (например, замените foo на debug и т. Д.)
Log4r::Logger.module_eval %{
  alias_method :foo, :debug
  alias_method :bar, :info
  alias_method :baz, :error
  alias_method :qux, :fatal
}

Надеюсь, поможет.

Другие вопросы по тегам