2016-01-19 3 views
0

Я настроил следующее с помощью этого: Ruby - share logger instance among module/classesКак я могу изменить настройки регистратора на основе переменной ENV в рубине с помощью регистратора?

EDIT: Основываясь на комментариях ниже, я обновил код, но все еще есть проблемы при входе.

module Logging 

    # in classes needing to be logged use 'include Logger' 
    require 'logger' 
    require 'remote_syslog_logger' 
    require_relative 'env' 

    class << self 
    def logger 

     return @logger if @logger 

     if ENV['ENVIRONMENT'] == 'production' #may need to change this 

     @logger ||= Logger.new($stdout) 

     @logger.level = Logger::WARN 
     @logger.datetime_format = "%N " 

     elsif ENV['ENVIRONMENT'] == 'development' 

     binding.pry 

     #$logger = Logger.new(STDOUT) 
     @logger = RemoteSyslogLogger.new('logs2.papertrailapp.com',39257) 
     @logger.level = Logger::DEBUG 
     @logger.datetime_format = "%N " 

     end 

    end 

    def logger=(logger) 
     @logger = logger 
    end 
    end 

    # Addition 
    def self.included(base) 
    class << base 
     def logger 
     Logging.logger 
     end 
    end 
    end 

    def logger 
    Logging.logger 
    end 


end 

Как войти:

class CronCheck 
    require_relative 'module_logger.rb' 
    include Logging 

    def self.run 
    begin 
     logger.debug "**** running cron_check_schedule.rb #{Time.now} #{Time.now.to_i}****" 
    rescue 
    end 
end 

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

Я получаю сообщение об ошибке при logger.debug: неопределенный метод `отладки» для „% N“: String

+0

Я просто используя рубин не рельсы. – Angela

+0

О, извините! Плохое понимание прочитанного с моей стороны. –

+0

Не стоит беспокоиться :) может вы еще что-нибудь предложить? – Angela

ответ

0

Ваш код почти точно прав. Что вам нужно сделать, хотя, устанавливается Logging.logger, не $logger:

def self.instantiate_logger 
    logger = Logger.new(STDOUT) 
    logger.datetime_format = "%N " 

    if ENV['ENVIRONMENT'] == 'production' 
    logger.level = Logger::WARN 
    elsif ENV['ENVIRONMENT'] == 'development' 
    logger.level = Logger::DEBUG 
    end 

    Logging.logger = logger 
end 

Это не ясно из вашего вопроса, где этот метод живет, но он должен быть где-то можно назвать его во время инициализации вашего приложения.

Вы заметите, что я удалил код, связанный с Pry; поскольку этот код напрямую не связан с протоколированием, он должен, вероятно, перейти в другое место.

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

LOG_LEVELS = { 
    "production" => Logger::WARN, 
    "development" => Logger::DEBUG 
} 

def self.instantiate_logger 
    Logging.logger = Logger.new(STDOUT).tap do |logger| 
    logger.datetime_format = "%N " 
    logger.level = LOG_LEVELS[ENV['ENVIRONMENT']] || LOG_LEVELS["development"] 
    end 
end 
+0

Спасибо. Если я хочу отправить одну среду на бумажный рельс вместо стандартного, заменил бы оператор logger.new. Не совсем уверен. Позвольте мне поразмышлять над этим. – Angela

+0

Где я должен немедленно его съесть с помощью этого метода? Могу ли я запустить его где-нибудь в вашем коде, поскольку модуль делает его доступным для всех классов? – Angela

+0

Хм, похоже, не работает в методе 'self.run'. Он не распознает регистратор. – Angela

0

Предполагая, что первый фрагмент является module Logging вы предполагаете включить везде для регистрации (в противном случае глобальные переменные, как в второй фрагмент просто отлично работает из коробки,) все, что вам нужно, чтобы инициализировать регистратор в соответствии фрагмент # 2:

# this is the topmost method from your snippet #1, 
# updated to use env settings for logger tuning 
def logger 
    # @logger ||= Logger.new($stdout) 
    return @logger if @logger 

    @logger = case ENV['ENVIRONMENT'] 
      when 'production' 
       Logger.new(STDOUT).tap do |logger| 
       logger.level = Logger::WARN 
       logger.datetime_format = "%N " 
       end 
      else 
       ....... 
      end 
end 

Вот и все.

+0

Я вижу. Как разрешить создание экземпляра журнала, который не является stdout? Для этого я использую удаленный syslogger. – Angela

+0

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

+0

vermind Я думаю, что это работает сейчас ...! – Angela

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