Ruby-为不同的目标设置不同的日志级别
想知道如何为不同的目标设置不同的日志级别。下面是我的Ruby-为不同的目标设置不同的日志级别,ruby,logging,Ruby,Logging,想知道如何为不同的目标设置不同的日志级别。下面是我的Ruby代码,它向控制台和文件写入一行代码 # https://stackoverflow.com/a/6407200 class MultiIO def initialize(*targets) @targets = targets end def write(*args) @targets.each do |t| t.write(*args) end end def close
Ruby
代码,它向控制台和文件写入一行代码
# https://stackoverflow.com/a/6407200
class MultiIO
def initialize(*targets)
@targets = targets
end
def write(*args)
@targets.each do |t|
t.write(*args)
end
end
def close
@targets.each(&:close)
end
end
module Logging
def self.logger(logname, programname, debug = false)
log_file = File.open(logname, "a")
log_file.sync = true
zlogger = Logger.new MultiIO.new(log_file, STDOUT)
zlogger.level = Logger::INFO
zlogger.progname = programname
zlogger.formatter = proc do |serverity, datetime, progname, msg|
"#{datetime.strftime('%Y-%m-%d %I:%M:%S %p %:::z %Z')} - #{serverity} - [#{progname}] | #{msg}\n"
end
zlogger
end
end
如果发现特殊环境变量,我可以将级别设置为调试,
$logger.level=logger::DEBUG if ENV['enable\u DEBUG\u logs']=“true”
但是,不确定如何始终将调试行写入日志文件,而仅将信息行写入控制台
有人知道吗?非常感谢您的帮助 因为日志级别是记录器的属性,而不是IO
,所以我觉得您真正需要做的是定义一个多记录器,而不是一个多IO
。大致如下:
class MultiLogger
attr_reader :default_level, :default_progname, :default_formatter
def initialize(**args)
@default_level = args[:default_level]
@default_progname = args[:default_progname]
@default_formatter = args[:default_formatter]
@loggers = []
Array(args[:loggers]).each { |logger| add_logger(logger) }
end
def add_logger(logger)
logger.level = default_level if default_level
logger.progname = default_progname if default_progname
logger.formatter = default_formatter if default_formatter
@loggers << logger
end
def close
@loggers.map(&:close)
end
Logger::Severity.constants.each do |level|
define_method(level.downcase) do |*args|
@loggers.each { |logger| logger.send(__method__, args) }
end
# These methods are a bit weird in the context of a "multi-logger" with varying levels,
# since they are now returning an `Array`; never a falsey value.
# You may want to define them differently, e.g. `@loggers.all? {...}`, or use a non-predicate method name here.
define_method("#{level.downcase}?".to_sym) do
@loggers.map(&__method__)
end
end
end
# Usage:
log_file = File.open(logname, "a")
log_file.sync = true
file_logger = Logger.new(log_file)
console_logger = Logger.new(STDOUT)
console_logger.level = Logger::INFO
multi_logger = MultiLogger.new(
default_progname: programname,
default_formatter: proc do |severity, datetime, progname, msg|
"#{datetime.strftime('%Y-%m-%d %I:%M:%S %p %:::z %Z')} - #{severity} - [#{progname}] | #{msg}\n"
end,
loggers: [file_logger, console_logger]
)
类多记录器
属性读取器:默认\u级别,:默认\u程序名,:默认\u格式化程序
def初始化(**参数)
@默认\u级别=参数[:默认\u级别]
@default\u progname=args[:default\u progname]
@default\u formatter=args[:default\u formatter]
@伐木工人=[]
数组(args[:logger])。每个{记录器{添加记录器(记录器)}
结束
def添加_记录器(记录器)
logger.level=默认\u级别(如果为默认\u级别)
logger.progname=默认值\u progname如果为默认值\u progname
logger.formatter=默认格式化程序(如果为默认格式化程序)
@事实上,一个快速的谷歌揭示了这方面的各种珍宝,例如——然而,其中一个(可能还有其他的)并不正确地支持日志之间的多个日志级别(原因如我上面的代码注释!)。因此,您可能会找到一个适合的gem,或者使用一些像上面这样的定制实现可能会更好。非常感谢!我会试试看,然后回来。先生,你真是个天才!这很有效,再次感谢!小调整-{msg[0]}
,因为msg
似乎是一个元素数组。