如何使用记录器根据 ruby 中的 ENV 变量更改记录器设置?
how can I change logger settings based on ENV variable in ruby using logger?
我使用这个设置了以下内容:Ruby - share logger instance among module/classes
编辑: 根据下面的评论,我更新了代码,但仍然存在日志记录问题。
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
假设第一个片段是 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
就是这样。
您的代码几乎完全正确。不过,您需要做的是设置 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
我使用这个设置了以下内容:Ruby - share logger instance among module/classes
编辑: 根据下面的评论,我更新了代码,但仍然存在日志记录问题。
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
假设第一个片段是 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
就是这样。
您的代码几乎完全正确。不过,您需要做的是设置 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