Using ActiveSupport::TaggedLogging
in the code with the following way was not so simple for me
logger.tagged('SOME_TAG') { logger.info 'Stuff' }
So I come up with the solution with other team members so we only have to call a simple method to log everything we required.
This is how we did it...
We created a file with the following content on lib/logging/custom_logger.rb
in library.
# lib/logging/custom_logger.rb module Logging class CustomLogger DEFAULTS = { level: :info } LEVELS = %w(debug info warn error fatal unknown).map(&:to_sym) def self.log(*tags, **params) level = determine_log_level(**params) params.delete(:level) message = build_message(*tags, **params) Rails.logger.send(level, message) end private def self.determine_log_level(**params) params.has_key?(:level) && params[:level].to_sym.in?(LEVELS) ? params[:level].to_sym : :info end def self.build_message(*tags, **params) tags.map!{ |tag| format_tag(tag) } params = params.map{ |args| format_param(args[0], args[1]) } tags.join(' ') + ' ' + params.join(' ') end def self.format_tag(tag) tag = tag.to_s.gsub(/[^\w]/i, '').upcase "[#{tag}]" end def self.format_param(key, value) key = key.to_s.gsub(/[^\w]/i, '').downcase value = value.to_s.gsub('"','') "#{key}=\"#{value}\"" end end end # Can be used in conjunction with Rails.logger.tagged and Rails.logger.silence def log(*tags, **params) Logging::CustomLogger.log(*tags, **params) end
def log(*tags, **params)
is a public method which used in the full app directory. We can call this method with the combinations of TAGS and parameters to help track the logs.
# Can be used in conjunction with Rails.logger.tagged and Rails.logger.silence def log(*tags, **params) Logging::CustomLogger.log(*tags, **params) end
require logging/custom_logger
added in some initializer or at the end of application.rb
so that log
can be accessed anywhere in the application.
module APP_NAME class Application < Rails::Application end end require 'logging/custom_logger'
class constant LEVELS
defining all the logging level supported. Whereas the default logging level is info
as defined in the DEFAULTS
constant.
logging lib will upcase the tags either we pass in a different case.
Example Usage:
log('MAIN_TAG', 'SUB_TAG', key1: "value1", key2: "value2", error_message: e.message) # Out put: #[MAIN_TAG] [SUB_TAG] key1=value1 key2=value2
The following exception handling will output the log:
begin user = User.find(params[:id]) # id = 100 rescue StandardError => e log('ERROR', 'USER', error: e.message) end [ERROR] [USER] error="ActiveRecord::RecordNotFound (Couldn't find User with 'id'=1000)"
The following is the gist of the above described lib https://gist.github.com/Sohair63/106dd168af3bc5f8f37f82c05947ce0f
Top comments (0)