Как я могу изменить настройки логгера, основываясь на переменной ENV в ruby, используя логгер?

Я настроил следующее с помощью этого: Ruby - делиться экземпляром регистратора между модулями / классами

РЕДАКТИРОВАТЬ: Основываясь на комментариях ниже, я обновил код, но по-прежнему возникают проблемы с ведением журнала.

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: неопределенный метод `debug'для"%N ": строка

2 ответа

Решение

Ваш код почти точно правильный. Что вам нужно сделать, тем не менее, установлено 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

Предполагая, что первый фрагмент 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

Вот и все.

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