Как я могу изменить настройки логгера, основываясь на переменной 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
Вот и все.