log4j в приложении JRuby on Rails - перенаправление журналов в отдельный файл - PullRequest
3 голосов
/ 25 января 2012

Я хочу получить более детальную регистрацию в моем приложении JRuby on Rails.Я представил log4j.В настоящее время у меня есть файл свойств, который выглядит следующим образом:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

#
log4j.logger.Rails=INFO, A

log4j.appender.A=org.apache.log4j.RollingFileAppender
log4j.appender.A.File=/usr/share/tomcat6/logs/production.log
log4j.appender.A.MaxFileSize=10000KB
log4j.appender.A.MaxBackupIndex=5
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Чтобы использовать Rails.logger, я использую следующий инициализатор:

org.apache.log4j.PropertyConfigurator.configure("#{::Rails.root.to_s}/config/log4j.properties")

Теперь я хочучтобы иметь возможность делать что-то вроде:

Rails.logger.feature_1("Log to feature_1.log")
Rails.logger.feature_N("Log to feature_N.log")

Каков наилучший способ сделать это, чтобы не все уходит в один файл журнала?

Также, чтобы отметить, я использую адаптер, о котором было написано здесь: http://squaremasher.blogspot.com/2009/08/jruby-rails-and-log4j.html

1 Ответ

2 голосов
/ 28 января 2012

Во-первых, вы должны определить конфигурацию appender / logger для каждой «функции», которая вам нужна в вашем log4j.properties файле:

...
log4j.logger.Rails=INFO, A

log4j.appender.A=org.apache.log4j.RollingFileAppender
log4j.appender.A.File=/usr/share/tomcat6/logs/production.log

...
log4j.logger.feature_1=INFO, feature_1

log4j.appender.feature_1=org.apache.log4j.RollingFileAppender
log4j.appender.feature_1.File=/path/to/your/feature_1.log
...
log4j.logger.feature_N=INFO, feature_N

log4j.appender.feature_N=org.apache.log4j.RollingFileAppender
log4j.appender.feature_N.File=/path/to/your/feature_N.log

Таким образом, у каждого регистратора будет свой собственный фильтр серьезности и файл назначения.

Тогда вместо того, чтобы всегда использовать один и тот же регистратор, вы можете выбрать его в зависимости от метода, который вы вызвали на стороне Рубины на луне (из предоставленного вами примера адаптера):

class Log4jAdapter

  def method_missing(meth, *args)
    # Checking the method name matches feature_N
    if /\Afeature_(\d+)\z/ =~ method.to_s
      # Retrieve the appropriate logger => getLogger('feature_N')
      logger = org.apache.log4j.Logger.getLogger(method.to_s)
      # Log !
      logger.log *args
    else
        puts "UNSUPPORTED METHOD CALLED: #{meth}"
    end
  end

end

Не провереноно я думаю, вы поймете идею.

...