contextualized_logs 0.0.1.pre.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +480 -0
- data/Rakefile +28 -0
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/application.js +16 -0
- data/app/assets/javascripts/cable.js +13 -0
- data/app/assets/stylesheets/application.css +15 -0
- data/app/channels/application_cable/channel.rb +4 -0
- data/app/channels/application_cable/connection.rb +4 -0
- data/app/controllers/application_controller.rb +2 -0
- data/app/controllers/model_controller.rb +26 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/jobs/application_job.rb +2 -0
- data/app/mailers/application_mailer.rb +4 -0
- data/app/models/application_record.rb +3 -0
- data/app/models/model.rb +4 -0
- data/app/views/layouts/application.html.erb +15 -0
- data/app/views/layouts/mailer.html.erb +13 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/app/workers/model_worker.rb +13 -0
- data/config/application.rb +19 -0
- data/config/boot.rb +4 -0
- data/config/cable.yml +10 -0
- data/config/credentials.yml.enc +1 -0
- data/config/database.yml +25 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +62 -0
- data/config/environments/production.rb +94 -0
- data/config/environments/test.rb +47 -0
- data/config/initializers/application_controller_renderer.rb +8 -0
- data/config/initializers/assets.rb +14 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/content_security_policy.rb +25 -0
- data/config/initializers/cookies_serializer.rb +5 -0
- data/config/initializers/filter_parameter_logging.rb +4 -0
- data/config/initializers/inflections.rb +16 -0
- data/config/initializers/mime_types.rb +4 -0
- data/config/initializers/sidekiq.rb +23 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/en.yml +33 -0
- data/config/master.key +1 -0
- data/config/puma.rb +37 -0
- data/config/routes.rb +3 -0
- data/config/spring.rb +6 -0
- data/config/storage.yml +34 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20200424081113_create_model.rb +7 -0
- data/db/schema.rb +19 -0
- data/db/seeds.rb +7 -0
- data/db/test.sqlite3 +0 -0
- data/lib/contextualized_logs/contextualized_controller.rb +63 -0
- data/lib/contextualized_logs/contextualized_logger.rb +90 -0
- data/lib/contextualized_logs/contextualized_model.rb +54 -0
- data/lib/contextualized_logs/contextualized_worker.rb +41 -0
- data/lib/contextualized_logs/current_context.rb +99 -0
- data/lib/contextualized_logs/railtie.rb +9 -0
- data/lib/contextualized_logs/sidekiq/middleware/client/inject_current_context.rb +38 -0
- data/lib/contextualized_logs/sidekiq/middleware/server/restore_current_context.rb +43 -0
- data/lib/contextualized_logs/version.rb +3 -0
- data/lib/contextualized_logs.rb +11 -0
- data/lib/tasks/contextualized_logs_tasks.rake +4 -0
- metadata +123 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module ContextualizedLogs
|
4
|
+
# custom logger for
|
5
|
+
# logging in json format with log enrichment
|
6
|
+
# support Rails.logger.dump('msg', hash)
|
7
|
+
|
8
|
+
class ContextualizedLogger < ActiveSupport::Logger
|
9
|
+
def initialize(*args)
|
10
|
+
super(*args)
|
11
|
+
@formatter = formatter
|
12
|
+
end
|
13
|
+
|
14
|
+
def dump(msg, attributes, severity = :info)
|
15
|
+
# log message with attributes as structured dump attributes
|
16
|
+
send(severity, { msg: msg, attributes: attributes })
|
17
|
+
end
|
18
|
+
|
19
|
+
def dump_error(msg, attributes)
|
20
|
+
dump(msg, attributes, :error)
|
21
|
+
end
|
22
|
+
|
23
|
+
def current_context
|
24
|
+
CurrentContext.context
|
25
|
+
end
|
26
|
+
|
27
|
+
def formatter
|
28
|
+
Proc.new{|severity, timestamp, progname, msg|
|
29
|
+
# format (and enrich) log in JSON format (-> )
|
30
|
+
# https://docs.hq.com/logs/processing/attributes_naming_convention/#source-code
|
31
|
+
# correlation = Datadog.tracer.active_correlation
|
32
|
+
data = {
|
33
|
+
# dd: {
|
34
|
+
# trace_id: correlation.trace_id,
|
35
|
+
# span_id: correlation.span_id
|
36
|
+
# },
|
37
|
+
# ddsource: ['ruby'],
|
38
|
+
syslog: { env: Rails.env, host: Socket.gethostname },
|
39
|
+
type: severity.to_s,
|
40
|
+
time: timestamp
|
41
|
+
}
|
42
|
+
data[:stack] = Kernel.caller.
|
43
|
+
map { |caller| caller.gsub(/#{Rails.root}/, '') }.
|
44
|
+
reject { |caller| caller.start_with?('/usr/local') || caller.include?('/shared/bundle/') || caller.start_with?('/Users/') }.
|
45
|
+
first(15)
|
46
|
+
data[:log_type] = 'log'
|
47
|
+
data.merge!(parse_msg(msg)) # parse message (string, hash, error, ...)
|
48
|
+
data.merge!(current_context) # merge current request context
|
49
|
+
data.to_json + "\n"
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def parse_msg(msg)
|
56
|
+
data = {}
|
57
|
+
case msg
|
58
|
+
when Hash
|
59
|
+
# used by logger.dump(msg|error, attributes = {})
|
60
|
+
if msg.include?(:attributes)
|
61
|
+
# adding message as log attributes if is a hash
|
62
|
+
data.merge!(parse_error(msg[:msg]))
|
63
|
+
data[:attributes] = msg[:attributes]
|
64
|
+
else
|
65
|
+
data.merge!(parse_error(msg))
|
66
|
+
end
|
67
|
+
else
|
68
|
+
data.merge!(parse_error(msg))
|
69
|
+
end
|
70
|
+
data
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_error(msg)
|
74
|
+
data = {}
|
75
|
+
case msg
|
76
|
+
when ::Exception
|
77
|
+
# format data to be interpreted as an error logs by
|
78
|
+
data[:error] = {
|
79
|
+
kind: msg.class.to_s,
|
80
|
+
message: msg.message,
|
81
|
+
stack: (msg.backtrace || []).join('; ')
|
82
|
+
}
|
83
|
+
else
|
84
|
+
data[:message] = msg.to_s
|
85
|
+
end
|
86
|
+
data
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require_relative 'current_context'
|
3
|
+
|
4
|
+
module ContextualizedLogs
|
5
|
+
module ContextualizedModel
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
DEFAULT_CURRENT_CONTEXT = ContextualizedLogs::CurrentContext
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
attr_reader :contextualizable_keys
|
12
|
+
|
13
|
+
def current_context
|
14
|
+
@current_context || DEFAULT_CURRENT_CONTEXT
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def contextualizable(keys: {})
|
20
|
+
@contextualizable_keys = keys
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_current_context(current_context)
|
24
|
+
@current_context = current_context
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def contextualize(model, keys, context)
|
30
|
+
# Rails.logger.debug "model: #{model}"
|
31
|
+
# Rails.logger.debug "keys: #{keys}"
|
32
|
+
# Rails.logger.debug "context.context: #{context}"
|
33
|
+
# Rails.logger.debug "context.contextualized_model_enabled: #{context.contextualized_model_enabled}"
|
34
|
+
return unless context.contextualized_model_enabled
|
35
|
+
keys&.each do |k, v|
|
36
|
+
v = model.try(v.to_sym)
|
37
|
+
context.add_context(k, v) if v
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
included do
|
43
|
+
after_find do |object|
|
44
|
+
# Rails.logger.debug "after_find #{object}"
|
45
|
+
ContextualizedModel.contextualize(object, self.class.contextualizable_keys, self.class.current_context)
|
46
|
+
end
|
47
|
+
|
48
|
+
after_create do
|
49
|
+
# Rails.logger.debug "after_create #{self}"
|
50
|
+
ContextualizedModel.contextualize(self, self.class.contextualizable_keys, self.class.current_context)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module ContextualizedLogs
|
4
|
+
module ContextualizedWorker
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
DEFAULT_CURRENT_CONTEXT = ContextualizedLogs::CurrentContext
|
8
|
+
DEFAULT_CONTEXTUALIZED_WORKER_ENABLED = false
|
9
|
+
DEFAULT_CONTEXTUALIZED_MODEL_ENABLED = false
|
10
|
+
|
11
|
+
class_methods do
|
12
|
+
# contextualize_args
|
13
|
+
|
14
|
+
def current_context
|
15
|
+
@current_context || DEFAULT_CURRENT_CONTEXT
|
16
|
+
end
|
17
|
+
|
18
|
+
def contextualized_worker_enabled
|
19
|
+
@contextualized_worker_enabled || DEFAULT_CONTEXTUALIZED_WORKER_ENABLED
|
20
|
+
end
|
21
|
+
|
22
|
+
def contextualized_model_enabled
|
23
|
+
@contextualized_model_enabled || DEFAULT_CONTEXTUALIZED_MODEL_ENABLED
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def set_current_context(current_context)
|
29
|
+
@current_context = current_context
|
30
|
+
end
|
31
|
+
|
32
|
+
def contextualized_worker(enabled)
|
33
|
+
@contextualized_worker_enabled = enabled
|
34
|
+
end
|
35
|
+
|
36
|
+
def contextualized_model(enabled)
|
37
|
+
@contextualized_model_enabled = enabled
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# https://github.com/rails/rails/pull/29180
|
2
|
+
# storing global request info
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
module ContextualizedLogs
|
6
|
+
class CurrentContext < ActiveSupport::CurrentAttributes
|
7
|
+
# ⚠️ do not use this class to store any controller specific info..
|
8
|
+
|
9
|
+
attribute \
|
10
|
+
:request_uuid, :request_user_agent, :request_origin, :request_referer, :request_xhr, # request
|
11
|
+
:current_job_id, :enqueued_jobs_ids, :worker, :worker_args, # sidekiq
|
12
|
+
:request_remote_ip, :request_ip, :request_remote_addr, :request_x_forwarded_for, # ips
|
13
|
+
:errors,
|
14
|
+
:contextualized_model_enabled, # enable model context values
|
15
|
+
:context_values, :context_values_count, # context values
|
16
|
+
:resource_name # controller_action to correlate APM metrics
|
17
|
+
|
18
|
+
MAX_CONTEXT_VALUES = 100
|
19
|
+
|
20
|
+
def self.context
|
21
|
+
# https://docs.hq.com/logs/processing/attributes_naming_convention/#source-code
|
22
|
+
|
23
|
+
data = {}
|
24
|
+
|
25
|
+
data[:resource_name] = resource_name unless resource_name.nil?
|
26
|
+
|
27
|
+
# normalized
|
28
|
+
data[:http] = {}
|
29
|
+
data[:http][:referer] = request_referer unless request_referer.nil?
|
30
|
+
data[:http][:request_id] = request_uuid unless request_uuid.nil?
|
31
|
+
data[:http][:useragent] = request_user_agent unless request_user_agent.nil?
|
32
|
+
data[:http][:origin] = request_origin unless request_origin.nil?
|
33
|
+
data.delete(:http) if data[:http].empty?
|
34
|
+
|
35
|
+
# normalized
|
36
|
+
data[:network] = { client: {} }
|
37
|
+
data[:network][:client][:ip] = request_ip unless request_ip.nil?
|
38
|
+
data[:network][:client][:remote_addr] = request_remote_addr unless request_remote_addr.nil?
|
39
|
+
data[:network][:client][:remote_ip] = request_remote_ip unless request_remote_ip.nil?
|
40
|
+
data[:network][:client][:x_forwarded_for] = request_x_forwarded_for unless request_x_forwarded_for.nil?
|
41
|
+
data.delete(:network) if data[:network][:client].empty?
|
42
|
+
|
43
|
+
# eventual error response
|
44
|
+
# normalized
|
45
|
+
data[:errors] = errors unless errors.nil?
|
46
|
+
|
47
|
+
# context_values
|
48
|
+
unless context_values.nil?
|
49
|
+
if context_values.is_a?(Hash) && !context_values.empty?
|
50
|
+
data[:context_values] = {}
|
51
|
+
context_values.each { |k, v| data[:context_values][k.to_sym] = v }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
unless current_job_id.nil? && worker.nil?
|
56
|
+
data[:job] = { id: current_job_id, worker: worker }
|
57
|
+
data[:job][:args] = worker_args if worker_args
|
58
|
+
end
|
59
|
+
|
60
|
+
data
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.to_json
|
64
|
+
attributes.to_json
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.add_context(key, value)
|
68
|
+
self.context_values_count ||= 0
|
69
|
+
self.context_values_count += 1
|
70
|
+
if self.context_values_count >= MAX_CONTEXT_VALUES
|
71
|
+
Rails.logger.warn('high number of context values') if self.context_values_count == MAX_CONTEXT_VALUES
|
72
|
+
return
|
73
|
+
|
74
|
+
end
|
75
|
+
self.context_values ||= {}
|
76
|
+
self.context_values[key] ||= []
|
77
|
+
unless self.context_values[key].include?(value)
|
78
|
+
self.context_values[key] << value
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.from_json(json)
|
83
|
+
return unless json
|
84
|
+
|
85
|
+
begin
|
86
|
+
values = JSON.parse(json).deep_symbolize_keys
|
87
|
+
values.each { |k, v| send("#{k}=", v) }
|
88
|
+
rescue
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.add_error(error)
|
93
|
+
return if error.nil?
|
94
|
+
|
95
|
+
self.errors ||= []
|
96
|
+
self.errors << error
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ContextualizedLogs
|
2
|
+
# https://github.com/mperham/sidekiq/wiki/Middleware
|
3
|
+
module Sidekiq
|
4
|
+
module Middleware
|
5
|
+
module Client
|
6
|
+
class InjectCurrentContext
|
7
|
+
# @param [String, Class] worker_class the string or class of the worker class being enqueued
|
8
|
+
# @param [Hash] job the full job payload
|
9
|
+
# * @see https://github.com/mperham/sidekiq/wiki/Job-Format
|
10
|
+
# @param [String] queue the name of the queue the job was pulled from
|
11
|
+
# @param [ConnectionPool] redis_pool the redis pool
|
12
|
+
# @return [Hash, FalseClass, nil] if false or nil is returned,
|
13
|
+
# the job is not to be enqueued into redis, otherwise the block's
|
14
|
+
# return value is returned
|
15
|
+
# @yield the next middleware in the chain or the enqueuing of the job
|
16
|
+
def call(worker_class, job, queue, redis_pool)
|
17
|
+
# https://github.com/rails/rails/issues/37526
|
18
|
+
# current attribute should be clear between jobs
|
19
|
+
# no need to `Current.reset`
|
20
|
+
worker_klass = worker_class.is_a?(String) ? worker_class.constantize : worker_class
|
21
|
+
if worker_klass.include?(ContextualizedWorker)
|
22
|
+
current_context = worker_klass.current_context
|
23
|
+
current_context.enqueued_jobs_ids ||= []
|
24
|
+
current_context.enqueued_jobs_ids << job['jid']
|
25
|
+
current_context.contextualized_model_enabled = worker_klass.contextualized_model_enabled
|
26
|
+
if worker_klass.contextualized_worker_enabled
|
27
|
+
job['context'] = current_context.to_json
|
28
|
+
Rails.logger.info "sidekiq: enqueing job #{worker_class}: #{job['jid']}, on queue: #{queue}"
|
29
|
+
Rails.logger.dump('Injecting context', JSON.parse(current_context.to_json), :debug)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
yield
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module ContextualizedLogs
|
2
|
+
# https://github.com/mperham/sidekiq/wiki/Middleware
|
3
|
+
module Sidekiq
|
4
|
+
module Middleware
|
5
|
+
module Server
|
6
|
+
# https://github.com/mperham/sidekiq/wiki/Middleware
|
7
|
+
class RestoreCurrentContext
|
8
|
+
# @param [Object] worker the worker instance
|
9
|
+
# @param [Hash] job the full job payload
|
10
|
+
# * @see https://github.com/mperham/sidekiq/wiki/Job-Format
|
11
|
+
# @param [String] queue the name of the queue the job was pulled from
|
12
|
+
# @yield the next middleware in the chain or worker `perform` method
|
13
|
+
# @return [Void]
|
14
|
+
def call(worker, job, queue)
|
15
|
+
worker_klass = worker.class
|
16
|
+
if worker_klass.include?(ContextualizedWorker)
|
17
|
+
job_context_json = job['context']
|
18
|
+
current_context = worker_klass.current_context
|
19
|
+
current_context.from_json(job_context_json) if job_context_json
|
20
|
+
current_context.current_job_id = job['jid']
|
21
|
+
current_context.worker = worker.class.to_s
|
22
|
+
# https://github.com/mperham/sidekiq/wiki/Job-Format
|
23
|
+
current_context.worker_args = worker_klass.contextualize_args(job['args']) if worker_klass.respond_to?(:contextualize_args) && job['args']
|
24
|
+
current_context.contextualized_model_enabled = worker_klass.contextualized_model_enabled
|
25
|
+
if worker_klass.contextualized_worker_enabled
|
26
|
+
Rails.logger.info "sidekiq: performing job #{worker_klass}: #{job['jid']}, on queue #{queue}"
|
27
|
+
yield
|
28
|
+
Rails.logger.info "sidekiq: completing job #{worker_klass}: #{job['jid']}, on queue #{queue}"
|
29
|
+
end
|
30
|
+
else
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
rescue StandardError => e
|
34
|
+
if worker_klass.include?(ContextualizedWorker)
|
35
|
+
Rails.logger.error "sidekiq: failure job #{worker.class}: #{job['jid']}, on queue #{queue}: #{e}"
|
36
|
+
end
|
37
|
+
raise e
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "contextualized_logs/contextualized_logger"
|
2
|
+
require "contextualized_logs/contextualized_controller"
|
3
|
+
require "contextualized_logs/contextualized_model"
|
4
|
+
require "contextualized_logs/current_context"
|
5
|
+
require "contextualized_logs/sidekiq/middleware/client/inject_current_context"
|
6
|
+
require "contextualized_logs/sidekiq/middleware/server/restore_current_context"
|
7
|
+
require "contextualized_logs/contextualized_worker"
|
8
|
+
|
9
|
+
module ContextualizedLogs
|
10
|
+
require "contextualized_logs/railtie" if defined?(Rails)
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: contextualized_logs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.pre.alpha
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hugues Bernet-Rollande
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |
|
14
|
+
Online logging solution (like [Datadog](https://www.datadoghq.com)) have drastically transform the way we log.
|
15
|
+
|
16
|
+
An app will nowdays logs dozen (hundred) of logs per requests.
|
17
|
+
|
18
|
+
The issue is often to correlate this logs, with the initiating request (or job) and add shared metadata on this logs.
|
19
|
+
|
20
|
+
Here come `ContextualizedLogs`.
|
21
|
+
|
22
|
+
The main idea is to enhance your logs from your controller (including `ContextualizedController`, which use a before action), which will add the params to your logs (and some metadata about the request itself, like `request.uuid`).
|
23
|
+
|
24
|
+
This metadata are stored in a `ActiveSupport::CurrentAttributes` which is a singleton (reset per request).
|
25
|
+
|
26
|
+
Each subsequent logs in this thread (request) will also be enriched with this metadata, making it easier to find all the logs associated with a request (`uuid`, `ip`, `params.xxx`).
|
27
|
+
|
28
|
+
On top of this, logs can also be enriched by the ActiveRecord model they use (`create` or `find`) (models including `ContextualizedModel`). So any time a contextualized model is created or find, some metadata related to the model (`id`, ...) will also be added to the logs.
|
29
|
+
|
30
|
+
Allowing you to find all logs which "touched" this models.
|
31
|
+
email:
|
32
|
+
- hugues@xdev.fr
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- MIT-LICENSE
|
38
|
+
- README.md
|
39
|
+
- Rakefile
|
40
|
+
- app/assets/config/manifest.js
|
41
|
+
- app/assets/javascripts/application.js
|
42
|
+
- app/assets/javascripts/cable.js
|
43
|
+
- app/assets/stylesheets/application.css
|
44
|
+
- app/channels/application_cable/channel.rb
|
45
|
+
- app/channels/application_cable/connection.rb
|
46
|
+
- app/controllers/application_controller.rb
|
47
|
+
- app/controllers/model_controller.rb
|
48
|
+
- app/helpers/application_helper.rb
|
49
|
+
- app/jobs/application_job.rb
|
50
|
+
- app/mailers/application_mailer.rb
|
51
|
+
- app/models/application_record.rb
|
52
|
+
- app/models/model.rb
|
53
|
+
- app/views/layouts/application.html.erb
|
54
|
+
- app/views/layouts/mailer.html.erb
|
55
|
+
- app/views/layouts/mailer.text.erb
|
56
|
+
- app/workers/model_worker.rb
|
57
|
+
- config/application.rb
|
58
|
+
- config/boot.rb
|
59
|
+
- config/cable.yml
|
60
|
+
- config/credentials.yml.enc
|
61
|
+
- config/database.yml
|
62
|
+
- config/environment.rb
|
63
|
+
- config/environments/development.rb
|
64
|
+
- config/environments/production.rb
|
65
|
+
- config/environments/test.rb
|
66
|
+
- config/initializers/application_controller_renderer.rb
|
67
|
+
- config/initializers/assets.rb
|
68
|
+
- config/initializers/backtrace_silencers.rb
|
69
|
+
- config/initializers/content_security_policy.rb
|
70
|
+
- config/initializers/cookies_serializer.rb
|
71
|
+
- config/initializers/filter_parameter_logging.rb
|
72
|
+
- config/initializers/inflections.rb
|
73
|
+
- config/initializers/mime_types.rb
|
74
|
+
- config/initializers/sidekiq.rb
|
75
|
+
- config/initializers/wrap_parameters.rb
|
76
|
+
- config/locales/en.yml
|
77
|
+
- config/master.key
|
78
|
+
- config/puma.rb
|
79
|
+
- config/routes.rb
|
80
|
+
- config/spring.rb
|
81
|
+
- config/storage.yml
|
82
|
+
- db/development.sqlite3
|
83
|
+
- db/migrate/20200424081113_create_model.rb
|
84
|
+
- db/schema.rb
|
85
|
+
- db/seeds.rb
|
86
|
+
- db/test.sqlite3
|
87
|
+
- lib/contextualized_logs.rb
|
88
|
+
- lib/contextualized_logs/contextualized_controller.rb
|
89
|
+
- lib/contextualized_logs/contextualized_logger.rb
|
90
|
+
- lib/contextualized_logs/contextualized_model.rb
|
91
|
+
- lib/contextualized_logs/contextualized_worker.rb
|
92
|
+
- lib/contextualized_logs/current_context.rb
|
93
|
+
- lib/contextualized_logs/railtie.rb
|
94
|
+
- lib/contextualized_logs/sidekiq/middleware/client/inject_current_context.rb
|
95
|
+
- lib/contextualized_logs/sidekiq/middleware/server/restore_current_context.rb
|
96
|
+
- lib/contextualized_logs/version.rb
|
97
|
+
- lib/tasks/contextualized_logs_tasks.rake
|
98
|
+
homepage: https://github.com/hugues/contextualized_logs
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 1.3.1
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.7.7
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Contextualize your logs (requests params, found/created model metadata, workers,
|
122
|
+
...)
|
123
|
+
test_files: []
|