How to Add a Custom Log Level to Logger in Ruby

How do I set the log level for ony one custom rails logger in rails

You can set the level right after adding the custom logger:

config.active_record.logger = Logger.new("log/custom_log_file.log")
config.active_record.logger.level = 2

Ruby - Set different log levels for different targets

Since the log level is a property of the logger, not of the IO, it sounds to me like what you really need to do is define a MultiLogger rather than a MultiIO. Something along the lines of:

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]
)

Log to different files based on logging level using Ruby logger

Define your own custom logger class:

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

Then configure your app to use this custom logger instead of the original. In Rails – for example - this– can be done in your environment config:

Rails.logger = DistinctFileLogger.new(Rails.root.join('log'))


Related Topics



Leave a reply



Submit