minato_logger 0.2.13 → 0.3.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: 30d7463ea874ebb8c5c225639287ef19ad5298f0194a8a40f58780cde4b21079
4
- data.tar.gz: 4626828e63f5fe5cca9d0ea669094d3e95331c3fe6f9d006a0971160276f9615
3
+ metadata.gz: 06f80153de91decba9f1d6a522d0b1e4d9b960ad25e73c233a0bc72631d86a18
4
+ data.tar.gz: 68ea47ede5ecb8d9c2dafa98730113433a8a8bde2195d1549b08e7411f8d9c08
5
5
  SHA512:
6
- metadata.gz: b4439e60fce5ed2f4db05ddeb07ed1244aab12fb91eacca38f480de434e52b9c9b4aea810872c5f0a1ca613b45451357735dc3b15687a470313af25a51318242
7
- data.tar.gz: 1c4a700119bacd6cbbc877fbab3da93e2e0b8e86c50153acaeb616596dd84d38334fd5b72d11f6558deb345fe973e0fa043f4628c27b9e91cfb02f8fa8a86d2b
6
+ metadata.gz: 9310c36ead85d039a937756560785b2aee184e4b92e8171f486d0bca3d93c5425caede4c535aec8cf59f601b907de9eef97c9af8b67b4e4b4b1effc2fc168744
7
+ data.tar.gz: f658c941750803befda71f8e1455ccdb0292f4ffe1d75d37d84cb37bcf47b99acea4e9c692090614f85d8f04004778765a872db5bab2c47885ef49ffc0a30091
data/.rubocop.yml CHANGED
@@ -8,7 +8,7 @@ AllCops:
8
8
 
9
9
  Style/StringLiterals:
10
10
  Enabled: true
11
- EnforcedStyle: single_quotes
11
+ EnforcedStyle: double_quotes
12
12
 
13
13
  Style/StringLiteralsInInterpolation:
14
14
  Enabled: true
@@ -19,6 +19,3 @@ Style/Documentation:
19
19
 
20
20
  Layout/LineLength:
21
21
  Max: 120
22
-
23
- Metrics/ClassLength:
24
- Max: 120
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
 
@@ -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,20 +46,18 @@ module MinatoLogger
46
46
  end
47
47
 
48
48
  def add_message_to_logs(log, message)
49
- ruby_version = { ruby_version: RUBY_VERSION }
50
- return log.merge(message, ruby_version) unless message.is_a? String
49
+ return log.merge(message) unless message.is_a? String
51
50
 
52
- log.merge({ message: message }, ruby_version)
51
+ log.merge({ message: message, ruby_version: RUBY_VERSION })
53
52
  end
54
53
 
55
54
  def add_tags_to_message(msg)
56
55
  return msg unless tags_text.present?
57
56
 
58
57
  if msg.is_a?(Hash)
59
- msg = msg.transform_keys(&:to_s)
60
- msg['message'] = "#{tags_text}#{msg["message"]}"
58
+ msg["message"] = "#{tags_text} #{msg["message"]}"
61
59
  else
62
- msg = "#{tags_text}#{msg}"
60
+ msg = "#{tags_text} #{msg}"
63
61
  end
64
62
 
65
63
  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,9 +1,9 @@
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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MinatoLogger
4
+ class Railtie < ::Rails::Railtie
5
+ config.minato_logger = MinatoLogger::Configuration.default
6
+
7
+ config.after_initialize do |app|
8
+ app.config.colorize_logging = false if Rails.env.production?
9
+
10
+ if defined? Minato::Trace::Middleware::IntegrateWithCloudLogging
11
+ app.config.minato_logger.middleware.use = Minato::Trace::Middleware::IntegrateWithCloudLogging
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MinatoLogger
4
- VERSION = '0.2.13'
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/minato_logger.rb CHANGED
@@ -1,11 +1,11 @@
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/engine'
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
9
9
 
10
10
  module MinatoLogger
11
11
  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,10 +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', '>= 7.0.0'
34
- spec.add_dependency 'rails', '>= 7.0.0'
33
+ spec.add_dependency "activesupport", "~> 8.0.2"
34
+ spec.add_dependency "rails", ">= 8.0.0"
35
35
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minato_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.13
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ferreri
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-02-12 00:00:00.000000000 Z
11
+ date: 2025-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 7.0.0
19
+ version: 8.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 7.0.0
26
+ version: 8.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 7.0.0
33
+ version: 8.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 7.0.0
40
+ version: 8.0.0
41
41
  description:
42
42
  email:
43
43
  - contato@ferreri.co
@@ -57,13 +57,12 @@ files:
57
57
  - compose.yml
58
58
  - lib/minato_logger.rb
59
59
  - lib/minato_logger/configuration.rb
60
- - lib/minato_logger/engine.rb
61
60
  - lib/minato_logger/formatters.rb
62
61
  - lib/minato_logger/formatters/base_formatter.rb
63
62
  - lib/minato_logger/formatters/fluent_bit.rb
64
63
  - lib/minato_logger/logger.rb
65
64
  - lib/minato_logger/middleware.rb
66
- - lib/minato_logger/middlewares/request_response_logger.rb
65
+ - lib/minato_logger/rails.rb
67
66
  - lib/minato_logger/version.rb
68
67
  - minato_logger.gemspec
69
68
  - sig/minato_logger.rbs
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails'
4
- require_relative 'middlewares/request_response_logger'
5
- require_relative 'configuration'
6
- require 'rails/rack/logger'
7
-
8
- module MinatoLogger
9
- class Engine < ::Rails::Engine
10
- isolate_namespace MinatoLogger
11
-
12
- initializer 'minato_logger.add_middleware' do |app|
13
- app.config.minato_logger = MinatoLogger::Configuration.default
14
- app.config.log_formatter = MinatoLogger::Formatters::FluentBit.new
15
- app.config.colorize_logging = false if Rails.env.production?
16
- if defined? Minato::Trace::Middleware::IntegrateWithCloudLogging
17
- app.config.minato_logger.middleware.use Minato::Trace::Middleware::IntegrateWithCloudLogging
18
- end
19
- Rails.application.config.middleware.swap(
20
- Rails::Rack::Logger,
21
- MinatoLogger::Middlewares::RequestResponseLogger,
22
- []
23
- )
24
- end
25
- end
26
- end
@@ -1,149 +0,0 @@
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
- SENSITIVE_HEADERS = %w[
10
- AUTHORIZATION PROXY_AUTHORIZATION X_CSRF_TOKEN
11
- HTTP_AUTHORIZATION HTTP_PROXY_AUTHORIZATION
12
- HTTP_X_CSRF_TOKEN COOKIE HTTP_COOKIE
13
- ].freeze
14
-
15
- private
16
-
17
- def call_app(request, env)
18
- log_request(request, env)
19
- handle = dispatch_request_event(request)
20
- data = process_request(env)
21
- [data[:status], data[:headers], [data[:body]]]
22
- ensure
23
- duration = ((current_time - data[:start_time]) * 1000).round(2)
24
- log_response(request, env, data.merge({ duration: duration }))
25
- finish_request_instrumentation(handle, env['rails.rack_logger_tag_count'])
26
- end
27
-
28
- def compute_tags(request)
29
- tags_to_use = @taggers.presence || Rails.application.config.log_tags || []
30
- tags_to_use.collect do |tag|
31
- next tag.call(request) if tag.is_a?(Proc)
32
- next request.send(tag) if tag.is_a?(Symbol)
33
-
34
- tag
35
- end
36
- end
37
-
38
- def process_request(env)
39
- data = { body: '', status: 500, start_time: current_time, headers: {} }
40
-
41
- data[:status], data[:headers], response = @app.call(env)
42
- data[:body] = extract_body_safely(response || [])
43
- data
44
- end
45
-
46
- def dispatch_request_event(request)
47
- instrumenter = ActiveSupport::Notifications.instrumenter
48
- handle = instrumenter.build_handle('request.action_dispatch', { request: request })
49
- handle.start
50
- handle
51
- end
52
-
53
- def log_request(request, env)
54
- log(default_log_data(request, env).merge({
55
- type: 'REQUEST',
56
- headers: extract_request_headers(request),
57
- body: extract_request_body(request),
58
- message: "REQUEST: #{request.method} #{request.fullpath}"
59
- }))
60
- end
61
-
62
- def log_response(request, env, data)
63
- payload = build_response_payload(request, env, data)
64
- log_level = data[:status] >= 500 ? :error : :info
65
- log(payload, log_level)
66
- end
67
-
68
- def default_log_data(request, env)
69
- route = env['action_dispatch.route_uri_pattern'] || request.path
70
- { rails_version: Rails.version, request_id: request.request_id, method: request.method,
71
- time: Time.zone.now.iso8601, remote_ip: request.remote_ip, route: route, ip: request.ip,
72
- path: request.fullpath, params: filter_params(request) }
73
- end
74
-
75
- def build_response_payload(request, env, data)
76
- default_log_data(request, env).merge({
77
- type: 'RESPONSE', duration: data[:duration], status: data[:status],
78
- response: safe_parse_json(data[:body]),
79
- headers: filter_sensitive_headers(data[:headers]),
80
- message: "RESPONSE: #{request.method} #{request.fullpath} - " \
81
- "#{data[:status]} (#{data[:duration]}ms)"
82
- })
83
- end
84
-
85
- def log(payload, level = :info)
86
- Rails.logger.public_send(level, payload)
87
- rescue StandardError => e
88
- Rails.logger.error({ message: "Logger Error: #{e.message}", payload: payload })
89
- end
90
-
91
- def extract_body_safely(response)
92
- body = []
93
- response.each { |part| body << part.to_s } if response.respond_to?(:each)
94
- response.close if response.respond_to?(:close)
95
- body.join
96
- end
97
-
98
- def filter_params(request)
99
- request.filtered_parameters.except(:controller, :action, :format)
100
- rescue StandardError
101
- {}
102
- end
103
-
104
- def safe_parse_json(body)
105
- return nil if body.blank?
106
-
107
- JSON.parse(body)
108
- rescue JSON::ParserError
109
- body.to_s
110
- end
111
-
112
- def extract_request_body(request)
113
- return nil unless request.body
114
-
115
- body = request.body.read
116
- request.body.rewind
117
- safe_parse_json(body)
118
- rescue StandardError => e
119
- "Error reading request body: #{e}"
120
- end
121
-
122
- def extract_request_headers(request)
123
- headers = {}
124
- request.headers.each do |k, v|
125
- next unless k.start_with?('HTTP_') || %w[CONTENT_TYPE CONTENT_LENGTH].include?(k)
126
-
127
- normalized_key = k.start_with?('HTTP_') ? k[5..] : k
128
-
129
- headers[normalized_key] = v
130
- end
131
-
132
- filter_sensitive_headers(headers)
133
- end
134
-
135
- def current_time
136
- Process.clock_gettime(Process::CLOCK_MONOTONIC)
137
- end
138
-
139
- def filter_sensitive_headers(headers)
140
- return {} unless headers.is_a?(Hash)
141
-
142
- headers.reject do |k, _|
143
- key = k.to_s.upcase.tr('-', '_')
144
- SENSITIVE_HEADERS.any? { |sensitive| key.include?(sensitive) }
145
- end
146
- end
147
- end
148
- end
149
- end