minato_logger 0.3.2 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 118dfb3dc19a91b17e9e1ad4f824b4009c0f43be96d9df4ee0274bb40d7255fe
4
- data.tar.gz: 5e1aa0d126e91c911b3538172661cc35dea2b5488335405026810fd8ccb8d560
3
+ metadata.gz: beb2a53745858a930802bf198ac1214e6015772f5b0d93b3448d4a85d7ad351f
4
+ data.tar.gz: 74c17c9525de490e4d2ce3dfeab74a82fa9dc26cf90216ef22c7eefaf12eb34f
5
5
  SHA512:
6
- metadata.gz: 3ba8c7e7570370e5b0c54f926b84f631504491945ef6e72b57f0dc6150c2c9a28df8b45db5110f42b45b535d8c5db71fe3ad6601b5522e05b4f09f516117e079
7
- data.tar.gz: 0a815bde56e438a84fe95a9398d0bd186070ef2aa1d17c3cb34ac4cf9be6e0c598fc2d129ca11e18838fd6dce6d93f313fbbbc99e917b793b567a8ee5c66c316
6
+ metadata.gz: 246404fe6ed3d1e2fa3e312e70a07287606b187e568fd177db702038705f7271cfab4c20cab4b7aa99fa23067141f672791682125e600bc7179b53d24ca0b689
7
+ data.tar.gz: f9fe0c1a5e827c150a1b8223c52bc399f094375c7d533d9bc25d5f13f47063ae3aec98e9db85b93015f17eb4eccaa20e7bf4129dd8683fbbff89b7662a6f134f
data/.rubocop.yml CHANGED
@@ -8,7 +8,7 @@ AllCops:
8
8
 
9
9
  Style/StringLiterals:
10
10
  Enabled: true
11
- EnforcedStyle: double_quotes
11
+ EnforcedStyle: single_quotes
12
12
 
13
13
  Style/StringLiteralsInInterpolation:
14
14
  Enabled: true
@@ -18,4 +18,7 @@ Style/Documentation:
18
18
  Enabled: false
19
19
 
20
20
  Layout/LineLength:
21
- Max: 120
21
+ Max: 125
22
+
23
+ Metrics/ClassLength:
24
+ Max: 150
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
- require "rubocop/rake_task"
8
+ require 'rubocop/rake_task'
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
@@ -2,10 +2,16 @@
2
2
 
3
3
  module MinatoLogger
4
4
  class Configuration
5
- attr_reader :middleware
5
+ attr_reader :middleware, :route_blacklist, :sensitive_headers
6
6
 
7
7
  def initialize
8
8
  @middleware = MinatoLogger::Middleware.new
9
+ @route_blacklist = %w[/health/alive /health/ready]
10
+ @sensitive_headers = %w[
11
+ AUTHORIZATION PROXY_AUTHORIZATION X_CSRF_TOKEN
12
+ HTTP_AUTHORIZATION HTTP_PROXY_AUTHORIZATION
13
+ HTTP_X_CSRF_TOKEN COOKIE HTTP_COOKIE
14
+ ]
9
15
 
10
16
  yield(self) if block_given?
11
17
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MinatoLogger
4
+ def self.context
5
+ Thread.current[:minato_logger_context] ||= {}
6
+ end
7
+
8
+ def self.with_context(attrs)
9
+ context.merge!(attrs)
10
+ yield
11
+ ensure
12
+ attrs.each_key { |k| context.delete(k) }
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+ require_relative 'middlewares/request_response_logger'
5
+ require_relative 'middlewares/request_context_enricher'
6
+ require_relative 'configuration'
7
+ require 'rails/rack/logger'
8
+
9
+ module MinatoLogger
10
+ class Engine < ::Rails::Engine
11
+ isolate_namespace MinatoLogger
12
+
13
+ initializer 'minato_logger.add_middleware' do |app|
14
+ app.config.minato_logger = MinatoLogger::Configuration.default
15
+ app.config.log_formatter = MinatoLogger::Formatters::FluentBit.new
16
+ app.config.colorize_logging = false if Rails.env.production?
17
+ if defined? Minato::Trace::Middleware::IntegrateWithCloudLogging
18
+ app.config.minato_logger.middleware.use Minato::Trace::Middleware::IntegrateWithCloudLogging
19
+ end
20
+ app.config.minato_logger.middleware.use MinatoLogger::Middlewares::RequestContextEnricher
21
+ Rails.application.config.middleware.swap(
22
+ Rails::Rack::Logger,
23
+ MinatoLogger::Middlewares::RequestResponseLogger,
24
+ []
25
+ )
26
+ end
27
+ end
28
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support"
3
+ require 'active_support'
4
4
 
5
5
  module MinatoLogger
6
6
  module Formatters
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json"
3
+ require 'json'
4
4
 
5
5
  module MinatoLogger
6
6
  module Formatters
@@ -18,7 +18,7 @@ module MinatoLogger
18
18
  private
19
19
 
20
20
  def sanitize_hash(hash)
21
- hash.transform_keys! { |key| key.to_s.encode("UTF-8", invalid: :replace, undef: :replace, replace: "?") }
21
+ hash.transform_keys! { |key| key.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') }
22
22
  hash.transform_values! do |value|
23
23
  sanitize_hash_value(value)
24
24
  end
@@ -27,11 +27,11 @@ module MinatoLogger
27
27
  def sanitize_hash_value(value)
28
28
  case value
29
29
  when String
30
- value.encode("UTF-8", invalid: :replace, undef: :replace, replace: "?")
30
+ value.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
31
31
  when Hash
32
32
  sanitize_hash(value)
33
33
  when Array
34
- value.map { |v| v.is_a?(String) ? v.encode("UTF-8", invalid: :replace, undef: :replace, replace: "?") : v }
34
+ value.map { |v| v.is_a?(String) ? v.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') : v }
35
35
  else
36
36
  value
37
37
  end
@@ -46,18 +46,20 @@ module MinatoLogger
46
46
  end
47
47
 
48
48
  def add_message_to_logs(log, message)
49
- return log.merge(message) unless message.is_a? String
49
+ ruby_version = { ruby_version: RUBY_VERSION }
50
+ return log.merge(message, ruby_version) unless message.is_a? String
50
51
 
51
- log.merge({ message: message, ruby_version: RUBY_VERSION })
52
+ log.merge({ message: message }, ruby_version)
52
53
  end
53
54
 
54
55
  def add_tags_to_message(msg)
55
56
  return msg unless tags_text.present?
56
57
 
57
58
  if msg.is_a?(Hash)
58
- msg["message"] = "#{tags_text} #{msg["message"]}"
59
+ msg = msg.transform_keys(&:to_s)
60
+ msg['message'] = "#{tags_text}#{msg["message"]}"
59
61
  else
60
- msg = "#{tags_text} #{msg}"
62
+ msg = "#{tags_text}#{msg}"
61
63
  end
62
64
 
63
65
  msg
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "minato_logger/formatters/base_formatter"
4
- require "minato_logger/formatters/fluent_bit"
3
+ require 'minato_logger/formatters/base_formatter'
4
+ require 'minato_logger/formatters/fluent_bit'
5
5
 
6
6
  module MinatoLogger
7
7
  module Formatters
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/logger"
4
- require "active_support/tagged_logging"
3
+ require 'active_support/logger'
4
+ require 'active_support/tagged_logging'
5
5
 
6
- require_relative "formatters/fluent_bit"
6
+ require_relative 'formatters/fluent_bit'
7
7
 
8
8
  module MinatoLogger
9
9
  class Logger < ActiveSupport::Logger
10
10
  include ActiveSupport::TaggedLogging
11
11
 
12
- def initialize
13
- super($stdout)
12
+ def initialize(out = nil)
13
+ super(out || $stdout)
14
14
  @formatter = Formatters::FluentBit.new
15
15
  end
16
16
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MinatoLogger
4
+ module Middlewares
5
+ class RequestContextEnricher
6
+ CONTEXT_FIELDS = %i[session_id page_url user_id calling_service].freeze
7
+
8
+ def call(log)
9
+ return log unless log.is_a?(Hash)
10
+
11
+ CONTEXT_FIELDS.each do |field|
12
+ value = MinatoLogger.context[field]
13
+ log[field] = value if value
14
+ end
15
+
16
+ log
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'rails/rack/logger'
5
+
6
+ module MinatoLogger
7
+ module Middlewares
8
+ class RequestResponseLogger < Rails::Rack::Logger
9
+ private
10
+
11
+ def call_app(request, env)
12
+ hdrs = extract_request_headers(request)
13
+ attrs = { session_id: hdrs['X_SESSION_ID'], page_url: hdrs['X_PAGE_URL'],
14
+ calling_service: hdrs['X_SERVICE_NAME'] }.compact
15
+ MinatoLogger.with_context(attrs) { process_with_logging(request, env) }
16
+ end
17
+
18
+ def process_with_logging(request, env)
19
+ should_log = should_log?(request)
20
+ ctx = {}
21
+ ctx[:request] = build_request_context_base(request) if should_log
22
+ log_request(request, env, ctx) if should_log
23
+ handle = dispatch_request_event(request)
24
+ status, headers, rack_body, log_body = process_request(env)
25
+ ctx[:response] = { status: status, headers: headers, body: log_body } if should_log
26
+ log_response(request, env, ctx) if should_log
27
+ finish_request_instrumentation(handle, env['rails.rack_logger_tag_count'])
28
+ [status, headers, rack_body]
29
+ end
30
+
31
+ def compute_tags(request)
32
+ tags_to_use = @taggers.presence || Rails.application.config.log_tags || []
33
+ tags_to_use.collect do |tag|
34
+ next tag.call(request) if tag.is_a?(Proc)
35
+ next request.send(tag) if tag.is_a?(Symbol)
36
+
37
+ tag
38
+ end
39
+ end
40
+
41
+ def build_request_context_base(request)
42
+ { start_time: current_time, headers: extract_request_headers(request),
43
+ body: extract_request_body(request) }
44
+ end
45
+
46
+ def should_log?(request)
47
+ blacklist = Rails.application.config.minato_logger.route_blacklist || []
48
+ blacklist.none? do |item|
49
+ next item.call(request) if item.is_a?(Proc)
50
+
51
+ request.path == item
52
+ end
53
+ end
54
+
55
+ def process_request(env)
56
+ status, headers, response = @app.call(env)
57
+ content_type = headers['Content-Type'].to_s
58
+
59
+ if content_type.include?('application/json') || content_type.include?('text/')
60
+ body_str = extract_body_safely(response || [])
61
+ [status, headers, [body_str], body_str]
62
+ else
63
+ [status, headers, response, "[Binary or Stream Response: #{content_type}]"]
64
+ end
65
+ end
66
+
67
+ def dispatch_request_event(request)
68
+ instrumenter = ActiveSupport::Notifications.instrumenter
69
+ handle = instrumenter.build_handle('request.action_dispatch', { request: request })
70
+ handle.start
71
+ handle
72
+ end
73
+
74
+ def log_request(request, env, ctx)
75
+ payload = { type: 'REQUEST', message: "Receiving request #{request.method} #{request.fullpath}" }
76
+ payload.merge!(default_log_data(request, env, ctx))
77
+ log(payload)
78
+ end
79
+
80
+ def log_response(request, env, ctx)
81
+ ctx[:response][:duration] = ((current_time - ctx.dig(:request, :start_time)) * 1000).round(2)
82
+ payload = build_response_payload(request, env, ctx)
83
+ log_level = ctx.dig(:response, :status) >= 500 ? :error : :info
84
+ log(payload, log_level)
85
+ end
86
+
87
+ def default_log_data(request, env, ctx)
88
+ route = env['action_dispatch.route_uri_pattern'] || request.path
89
+ request = { id: request.request_id, method: request.method,
90
+ time: Time.zone.now.iso8601, remote_ip: request.remote_ip, route: route, ip: request.ip,
91
+ path: request.fullpath, params: filter_params(request), headers: ctx.dig(:request, :headers),
92
+ body: ctx.dig(:request, :body) }
93
+ { rails_version: Rails.version, request: request }
94
+ end
95
+
96
+ def build_response_payload(request, env, ctx)
97
+ response = { body: safe_parse_json(ctx.dig(:response, :body)),
98
+ headers: filter_sensitive_headers(ctx.dig(:response, :headers)),
99
+ status: ctx.dig(:response, :status), duration: ctx.dig(:response, :duration) }
100
+ payload = { type: 'RESPONSE', response: response,
101
+ message: "Responding #{request.method} #{request.fullpath} " \
102
+ "- #{ctx.dig(:response, :status)} (#{ctx.dig(:response, :duration)}ms)" }
103
+ default_log_data(request, env, ctx).merge(payload)
104
+ end
105
+
106
+ def log(payload, level = :info)
107
+ Rails.logger.public_send(level, payload)
108
+ rescue StandardError => e
109
+ Rails.logger.error({ message: "Logger Error: #{e.message}", payload: payload })
110
+ end
111
+
112
+ def extract_body_safely(response)
113
+ body = []
114
+ response.each { |part| body << part.to_s } if response.respond_to?(:each)
115
+ response.close if response.respond_to?(:close)
116
+ body.join
117
+ end
118
+
119
+ def filter_params(request)
120
+ request.filtered_parameters.except(:controller, :action, :format)
121
+ rescue StandardError
122
+ {}
123
+ end
124
+
125
+ def safe_parse_json(body)
126
+ return nil if body.blank?
127
+
128
+ JSON.parse(body)
129
+ rescue JSON::ParserError
130
+ body.to_s
131
+ end
132
+
133
+ def extract_request_body(request)
134
+ return nil unless request.body
135
+ return '[Multipart Form Data / File Upload]' if request.content_type.to_s.include?('multipart/form-data')
136
+
137
+ body = request.raw_post
138
+ return nil if body.blank?
139
+
140
+ request.body.rewind if request.body.respond_to?(:rewind)
141
+ safe_parse_json(body)
142
+ rescue StandardError => e
143
+ "Error reading request body: #{e}"
144
+ end
145
+
146
+ def extract_request_headers(request)
147
+ headers = {}
148
+ request.headers.each do |k, v|
149
+ next unless k.start_with?('HTTP_') || %w[CONTENT_TYPE CONTENT_LENGTH].include?(k)
150
+
151
+ normalized_key = k.start_with?('HTTP_') ? k[5..] : k
152
+
153
+ headers[normalized_key] = v
154
+ end
155
+
156
+ filter_sensitive_headers(headers)
157
+ end
158
+
159
+ def current_time
160
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
161
+ end
162
+
163
+ def filter_sensitive_headers(headers)
164
+ return {} unless headers.is_a?(Hash)
165
+
166
+ headers.reject do |k, _|
167
+ key = k.to_s.upcase.tr('-', '_')
168
+ Rails.application.config.minato_logger.sensitive_headers.any? { |sensitive| key.include?(sensitive) }
169
+ end
170
+ end
171
+
172
+ def finish_request_instrumentation(handle, payload)
173
+ if defined?(super)
174
+ super
175
+ elsif handle
176
+ handle.finish
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MinatoLogger
4
- VERSION = "0.3.2"
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/minato_logger.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "minato_logger/version"
4
- require "minato_logger/middleware"
5
- require "minato_logger/configuration"
6
- require "minato_logger/formatters"
7
- require "minato_logger/logger"
8
- require "minato_logger/rails" if defined? Rails::Railtie
3
+ require 'minato_logger/version'
4
+ require 'minato_logger/middleware'
5
+ require 'minato_logger/configuration'
6
+ require 'minato_logger/context'
7
+ require 'minato_logger/formatters'
8
+ require 'minato_logger/logger'
9
+ require 'minato_logger/engine'
9
10
 
10
11
  module MinatoLogger
11
12
  class << self
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "lib/minato_logger/version"
3
+ require_relative 'lib/minato_logger/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "minato_logger"
6
+ spec.name = 'minato_logger'
7
7
  spec.version = MinatoLogger::VERSION
8
- spec.authors = ["Ferreri"]
9
- spec.email = ["contato@ferreri.co"]
8
+ spec.authors = ['Ferreri']
9
+ spec.email = ['contato@ferreri.co']
10
10
 
11
- spec.summary = "Log enhancements for Minato Rails Apps."
12
- spec.homepage = "https://gitlab.com/ferreri/minato/minato-logger-rails"
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 2.6.0"
11
+ spec.summary = 'Log enhancements for Minato Rails Apps.'
12
+ spec.homepage = 'https://gitlab.com/ferreri/minato/minato-logger-rails'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = '>= 2.6.0'
15
15
 
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://gitlab.com/ferreri/minato/minato-logger-rails"
18
- spec.metadata["changelog_uri"] = "https://gitlab.com/ferreri/minato/minato-logger-rails/-/blob/main/CHANGELOG.md?ref_type=heads"
19
- spec.metadata["rubygems_mfa_required"] = "true"
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://gitlab.com/ferreri/minato/minato-logger-rails'
18
+ spec.metadata['changelog_uri'] = 'https://gitlab.com/ferreri/minato/minato-logger-rails/-/blob/main/CHANGELOG.md?ref_type=heads'
19
+ spec.metadata['rubygems_mfa_required'] = 'true'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -26,11 +26,10 @@ Gem::Specification.new do |spec|
26
26
  f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
27
27
  end
28
28
  end
29
- spec.bindir = "exe"
29
+ spec.bindir = 'exe'
30
30
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
31
+ spec.require_paths = ['lib']
32
32
 
33
- spec.add_dependency "activesupport", "~> 8.0.2"
34
- spec.add_dependency "lograge", ">= 0.14.0"
35
- spec.add_dependency "rails", ">= 8.0.0"
33
+ spec.add_dependency 'activesupport', '>= 7.0.0'
34
+ spec.add_dependency 'rails', '>= 7.0.0'
36
35
  end
metadata CHANGED
@@ -1,57 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minato_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ferreri
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-12-03 00:00:00.000000000 Z
11
+ date: 2026-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 8.0.2
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 8.0.2
27
- - !ruby/object:Gem::Dependency
28
- name: lograge
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
32
18
  - !ruby/object:Gem::Version
33
- version: 0.14.0
19
+ version: 7.0.0
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
- version: 0.14.0
26
+ version: 7.0.0
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rails
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: 8.0.0
33
+ version: 7.0.0
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: 8.0.0
40
+ version: 7.0.0
55
41
  description:
56
42
  email:
57
43
  - contato@ferreri.co
@@ -71,12 +57,15 @@ files:
71
57
  - compose.yml
72
58
  - lib/minato_logger.rb
73
59
  - lib/minato_logger/configuration.rb
60
+ - lib/minato_logger/context.rb
61
+ - lib/minato_logger/engine.rb
74
62
  - lib/minato_logger/formatters.rb
75
63
  - lib/minato_logger/formatters/base_formatter.rb
76
64
  - lib/minato_logger/formatters/fluent_bit.rb
77
65
  - lib/minato_logger/logger.rb
78
66
  - lib/minato_logger/middleware.rb
79
- - lib/minato_logger/rails.rb
67
+ - lib/minato_logger/middlewares/request_context_enricher.rb
68
+ - lib/minato_logger/middlewares/request_response_logger.rb
80
69
  - lib/minato_logger/version.rb
81
70
  - minato_logger.gemspec
82
71
  - sig/minato_logger.rbs
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "lograge"
4
-
5
- module MinatoLogger
6
- class Railtie < ::Rails::Railtie
7
- config.minato_logger = MinatoLogger::Configuration.default
8
-
9
- config.after_initialize do |app|
10
- app.config.colorize_logging = false if Rails.env.production?
11
-
12
- if defined? Minato::Trace::Middleware::IntegrateWithCloudLogging
13
- app.config.minato_logger.middleware.use Minato::Trace::Middleware::IntegrateWithCloudLogging
14
- end
15
- end
16
-
17
- config.lograge.enabled = true
18
-
19
- config.lograge.formatter = Lograge::Formatters::Raw.new
20
-
21
- config.lograge.base_controller_class = "ActionController::API"
22
-
23
- config.lograge.custom_options = lambda do |event|
24
- {
25
- time: Time.zone.now.iso8601,
26
- params: event.payload[:params],
27
- response: event.payload[:response_body],
28
- exception: event.payload[:exception],
29
- exception_object: event.payload[:exception_object],
30
- request_id: event.payload[:request_id],
31
- user_id: event.payload[:user_id],
32
- remote_ip: event.payload[:remote_ip]
33
- }
34
- end
35
-
36
- ActiveSupport::Notifications.subscribe(
37
- "process_action.action_controller"
38
- ) do |_name, _started, _finished, _unique_id, payload|
39
- response = payload[:response]
40
-
41
- payload[:response_body] = begin
42
- JSON.parse(response.body)
43
- rescue StandardError
44
- response.body
45
- end
46
- end
47
- end
48
- end