Home > Software engineering >  Approach to a custom rails logger
Approach to a custom rails logger

Time:10-15

My Rails application runs in Heroku; recently, we have changed the Heroku LOG_LEVEL to WARN as the system logs flooded with so many unwanted information. But still, in some of the areas, I wanted to use Rails.logger.info;

Currently, in Heroku we have this:

LOG_LEVEL = WARN

And in production.rb, still that is

config.log_level = :info
config.log_formatter = ::Logger::Formatter.new

The above configuration we didn't change it, as the precedence is for LOG_LEVEL if we set that. So with the above configuration, if we put Rails.logger.info "Hello world," that will not work because the logger will only handle the logs equal or higher to warn in importance.

So we have tried one other way.

Created a new initializer called custom_logger.rb; we put

$INFO_LOGGER = Rails.logger.dup
$INFO_LOGGER.level = :info

then wherever we wanted to use info, we just called $INFO_LOGGER.info "Hello World," this prints

Is this a correct approach, like using the global variable?

CodePudding user response:

You don't want to use global variables. Instead create a custom class for example

class MyLogger
  class << self 

    def info(*args)
      new.info(*args)
    end
  end

  delegate :info, to: :logger 

  attr_reader :logger

  def initialize
    @logger = ActiveSupport::Logger.new(Rails.root.join("log/my_logger.#{Rails.env}.log"))
    @logger.formatter = ::Logger::Formatter.new
  end
end

Now you can call MyLogger.info("this is a test message") and it will output the message in the log file regardless of the LOG_LEVEL or config.log_level = :info

CodePudding user response:

Rails uses ActiveSupport::Logger by default which is essentially just a ruby Logger.

If there are messages you always want logged regardless of the level you can use Logger#unknown.

Per the Documents:

Log an UNKNOWN message. This will be printed no matter what the logger's level is.

So You can use this to your advantage for the messages that you always want to show while still avoiding the noise of the standard info messages:

For Example:

Rails.logger.info "Noisy message" # won't show when LOG_LEVEL > INFO 
Rails.logger.unknown "VERY IMPORTANT MESSAGE" # will show not matter what 
  • Related