我在写一个耙子,只是想知道是否可以配置Ruby logger,以便根据不同的日志记录级别记录到不同的文件。
例如
# log to info.log
logger.info "processing: 1/10"
logger.info "processing: 2/10"
logger.info "processing: 3/10"
...
# log to error.log
logger.error "Validation failed on :email"
logger.error "Validation failed on :name"
Run Code Online (Sandbox Code Playgroud)
更新资料
我本来会找到一个固有的解决方案,但似乎没有。感谢@spickermann的快速回答,我将提出他的想法来调整我自己的版本。
如果有人需要,这是最终代码。
require 'logger'
class DistinctFileLogger
LOG_LEVEL = [:debug , :info , :warn , :error , :fatal , :unknown]
def initialize(path)
@loggers = {}
LOG_LEVEL.each do |level|
@loggers[level] = Logger.new(path)
end
end
LOG_LEVEL.each do |level|
define_method(level) do |message|
@loggers[level].send(level, message)
end
define_method("set_#{level}_path") do |path|
@loggers[level] = Logger.new(path)
end
end
end
logger = DistinctFileLogger.new(STDOUT)
logger.set_error_path("{path_to}/error.log")
logger.info "processing: 1/10"
logger.info "processing: 2/10"
logger.info "processing: 3/10"
# STDOUT
# I, [2015-12-10T22:30:06.749612 #63303] INFO -- : processing: 1/10
# I, [2015-12-10T22:30:06.749672 #63303] INFO -- : processing: 2/10
# I, [2015-12-10T22:30:06.749692 #63303] INFO -- : processing: 3/10
logger.error "Validation failed on :email"
logger.error "Validation failed on :name"
# error.log
# # Logfile created on 2015-12-10 22:30:06 +0800 by logger.rb/47272
# E, [2015-12-10T22:30:06.749708 #63303] ERROR -- : Validation failed on :email
# E, [2015-12-10T22:30:06.749729 #63303] ERROR -- : Validation failed on :name
Run Code Online (Sandbox Code Playgroud)
定义自己的自定义记录器类:
require 'logger'
class DistinctFileLogger
LOG_LEVEL = [:debug , :info , :warn , :error , :fatal , :unknown]
def initialize(path)
@loggers = {}
LOG_LEVEL.each do |level|
@loggers[level] = Logger.new("#{path}/#{level}.log")
end
end
LOG_LEVEL.each do |level|
define_method(level) do |message|
@loggers[level].send(level, message)
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后将您的应用配置为使用此自定义记录器,而不是原始记录器。例如,在Rails中-可以在您的环境配置中完成:
Rails.logger = DistinctFileLogger.new(Rails.root.join('log'))
Run Code Online (Sandbox Code Playgroud)