Repository URL to install this package:
|
Version:
0.0.27 ▾
|
# frozen_string_literal: true
module Elixir
# Logger
module Logger
# ElixirLogger
class ElixirLogger < ::Logger
def initialize(io_devices_and_loggers,
app_name: nil,
class_name: nil,
filter: nil)
@app_name = app_name || ''
@class_name = class_name
@filter = Filter.new(filter)
@logger = Timber::Logger.new(*io_devices_and_loggers)
end
def info(message,
class_name: nil,
options: nil)
user = RequestStore.store[:current_user]
msg = log('INFO', message, class_name)
if user.nil?
@logger.info msg, options
else
Timber.with_context(user_context(user)) do
@logger.info msg, options
end
end
end
def error(message,
class_name: nil,
options: nil)
user = RequestStore.store[:current_user]
msg = log('ERROR', message, class_name)
if user.nil?
@logger.error msg, options
else
Timber.with_context(user_context(user)) do
@logger.error msg, options
end
end
end
def warn(message,
class_name: nil,
options: nil)
user = RequestStore.store[:current_user]
msg = log('WARN', message, class_name)
if user.nil?
@logger.error msg, options
else
Timber.with_context(user_context(user)) do
@logger.error msg, options
end
end
end
def debug(message,
class_name: nil,
options: nil)
user = RequestStore.store[:current_user]
msg = log('DEBUG', message, class_name)
if user.nil?
@logger.error msg, options
else
Timber.with_context(user_context(user)) do
@logger.error msg, options
end
end
end
private
LEVEL = {
INFO: :magenta,
WARN: :yellow,
ERROR: :red,
DEBUG: :magenta
}.freeze
def log(level, msg, class_name)
@class_name ||= class_name
msg = if msg.is_a?(Hash)
params = @filter.call(msg[:params])
{
app_name: "[#{Paint[@app_name, :blue]}]",
class_name: @class_name.nil? ? nil : "[#{Paint[@class_name, :blue]}]",
level: "[#{Paint[level, LEVEL[level.to_sym]]}]",
date: "[#{Paint[Time.now.to_s, :cyan]}]",
msg: "#{msg[:http]} #{msg[:verb]} #{msg[:status]} #{msg[:ip]} #{msg[:path]} #{msg[:length]} #{params}"
}
else
{
app_name: "[#{Paint[@app_name, :blue]}]",
class_name: @class_name.nil? ? nil : "[#{Paint[@class_name, :blue]}]",
level: "[#{Paint[level, LEVEL[level.to_sym]]}]",
date: "[#{Paint[Time.now.to_s, :cyan]}]",
msg: msg
}
end
msg.reject { |_, v| v.nil? }.map { |_, v| v }.join(' ')
end
def user_context(user)
Timber::Contexts::User.new id: user.id,
email: user.email,
name: user.name,
meta: user.meta
end
end
end
end