Logging into different files based on logging level using Ruby logger

I write a rake, just wondering if I can configure the Ruby logger to log into different files based on different levels of logging.

eg.

# 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"

Update

I have found an integral solution, and it seems that it is not. Thanks for the quick reply @spickermann, and I will go by his thought to set up my own version.

Here is the final code if someone needs it.

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
+5
source share
1 answer

Define your own 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 application to use this user registrar instead of the original one. In Rails, for example, this can be done in the configuration of your environment:

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

Source: https://habr.com/ru/post/1619354/


All Articles