minato_logger 0.2.4 → 0.2.6

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: c4bf9363a716cafb4c233b79f41991509e480e5df286f14323e8a5ec3bdced45
4
- data.tar.gz: b6c5285531e4d9c43917980078969c47e22d9ec04fb0948f6bbfc91d86913b57
3
+ metadata.gz: e5cca6802e6043f3267c2edc5bf7ebaec032e34f8acdbbea932ef1d00109b182
4
+ data.tar.gz: 210343998fbd313238c6cc518b1c17f87ae0c2dc6292f575a96ad72dbed7dced
5
5
  SHA512:
6
- metadata.gz: 04e79715819ada2f4b6f0e6a1d0358ee1eed1c723bb07d67938abe0e15bc77db6698c5feb57157e5b09600dd93b403ec3e2cf1c664e557bd2a927cbe8df0fe6a
7
- data.tar.gz: b2df064e6378209586aeea42c4c6d09c9bb6d63b609fe11521642b2c30c95329d1c25e70fa5ade6e36a69e01d815715fb9b8ddd9c4d76c8de088b77ed10ca62a
6
+ metadata.gz: ec33233c8e3ede2fe790217c88e6871a24c1524db0dd027261692b9e2133a6edf8160d65da1076d0da41ae04564ff2d3ca9805c343d35cb647d81d1dac514113
7
+ data.tar.gz: 3504f55036084964dd9f1f445c15658e1279fe5d8204556bb9fe3e62980b06d174d6de9231f12a4ec33bb54679f933616ca802fdb7a836683c0235f39b9936cf
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
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
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+ require_relative 'middlewares/request_response_logger'
5
+
6
+ module MinatoLogger
7
+ class Engine < ::Rails::Engine
8
+ isolate_namespace MinatoLogger
9
+
10
+ initializer 'minato_logger.add_middleware' do |app|
11
+ app.config.colorize_logging = false if Rails.env.production?
12
+ if defined? Minato::Trace::Middleware::IntegrateWithCloudLogging
13
+ app.config.middleware.use Minato::Trace::Middleware::IntegrateWithCloudLogging
14
+ end
15
+ app.config.middleware.insert_after ActionDispatch::RequestId, MinatoLogger::Middlewares::RequestResponseLogger
16
+ end
17
+ end
18
+ 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
@@ -55,9 +55,10 @@ module MinatoLogger
55
55
  return msg unless tags_text.present?
56
56
 
57
57
  if msg.is_a?(Hash)
58
- msg["message"] = "#{tags_text} #{msg["message"]}"
58
+ msg = msg.transform_keys(&:to_s)
59
+ msg['message'] = "#{tags_text}#{msg["message"]}"
59
60
  else
60
- msg = "#{tags_text} #{msg}"
61
+ msg = "#{tags_text}#{msg}"
61
62
  end
62
63
 
63
64
  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,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module MinatoLogger
6
+ module Middlewares
7
+ class RequestResponseLogger
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ request = ActionDispatch::Request.new(env)
14
+
15
+ log_request(request, env)
16
+
17
+ execute_with_logging(request, env)
18
+ end
19
+
20
+ private
21
+
22
+ def execute_with_logging(request, env)
23
+ data = { body: '', status: 500, start_time: current_time }
24
+
25
+ begin
26
+ data[:status], headers, response = @app.call(env)
27
+ data[:body] = extract_body_safely(response || [])
28
+
29
+ [data[:status], headers, [data[:body]]]
30
+ ensure
31
+ log_response(request, env, data.merge({ duration: calculate_duration(data[:start_time]) }))
32
+ end
33
+ end
34
+
35
+ def log_request(request, env)
36
+ log(default_log_data(request, env).merge({
37
+ type: 'REQUEST',
38
+ message: "REQUEST: #{request.method} #{request.fullpath}"
39
+ }))
40
+ end
41
+
42
+ def log_response(request, env, data)
43
+ payload = build_response_payload(request, env, data)
44
+ log_level = data[:status] >= 500 ? :error : :info
45
+ log(payload, log_level)
46
+ end
47
+
48
+ def default_log_data(request, env)
49
+ route_pattern = env['action_dispatch.route_uri_pattern'] || request.path
50
+ { rails_version: Rails.version, request_id: request.request_id, method: request.method,
51
+ time: Time.zone.now.iso8601, remote_ip: request.remote_ip, route_pattern: route_pattern, ip: request.ip,
52
+ path: request.fullpath, params: filter_params(request) }
53
+ end
54
+
55
+ def build_response_payload(request, env, data)
56
+ default_log_data(request, env).merge({
57
+ type: 'RESPONSE', duration: data[:duration], status: data[:status],
58
+ response: safe_parse_json(data[:body]),
59
+ message: "RESPONSE: #{request.method} #{request.fullpath} - " \
60
+ "#{data[:status]} (#{data[:duration]}ms)"
61
+ })
62
+ end
63
+
64
+ def log(payload, level = :info)
65
+ Rails.logger.public_send(level, payload.to_json)
66
+ rescue StandardError => e
67
+ Rails.logger.error({ message: "Logger Error: #{e.message}", payload: payload }.to_json)
68
+ end
69
+
70
+ def extract_body_safely(response)
71
+ body = []
72
+ response.each { |part| body << part.to_s } if response.respond_to?(:each)
73
+ response.close if response.respond_to?(:close)
74
+ body.join
75
+ end
76
+
77
+ def filter_params(request)
78
+ request.filtered_parameters.except(:controller, :action, :format)
79
+ rescue StandardError
80
+ {}
81
+ end
82
+
83
+ def safe_parse_json(body)
84
+ return nil if body.blank?
85
+
86
+ JSON.parse(body)
87
+ rescue JSON::ParserError
88
+ body.to_s
89
+ end
90
+
91
+ def current_time
92
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
93
+ end
94
+
95
+ def calculate_duration(start_time)
96
+ ((current_time - start_time) * 1000).round(2)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MinatoLogger
4
- VERSION = "0.2.4"
4
+ VERSION = '0.2.6'
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/rails" if defined? Rails::Railtie
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'
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,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", ">= 7.0.0"
34
- spec.add_dependency "lograge", ">= 0.14.0"
35
- spec.add_dependency "rails", ">= 7.0.0"
33
+ spec.add_dependency 'activesupport', '>= 7.0.0'
34
+ spec.add_dependency 'rails', '>= 7.0.0'
36
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minato_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.6
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-04 00:00:00.000000000 Z
11
+ date: 2026-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 7.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: lograge
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.14.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 0.14.0
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rails
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -71,12 +57,13 @@ files:
71
57
  - compose.yml
72
58
  - lib/minato_logger.rb
73
59
  - lib/minato_logger/configuration.rb
60
+ - lib/minato_logger/engine.rb
74
61
  - lib/minato_logger/formatters.rb
75
62
  - lib/minato_logger/formatters/base_formatter.rb
76
63
  - lib/minato_logger/formatters/fluent_bit.rb
77
64
  - lib/minato_logger/logger.rb
78
65
  - lib/minato_logger/middleware.rb
79
- - lib/minato_logger/rails.rb
66
+ - lib/minato_logger/middlewares/request_response_logger.rb
80
67
  - lib/minato_logger/version.rb
81
68
  - minato_logger.gemspec
82
69
  - sig/minato_logger.rbs
@@ -1,47 +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
- payload = event.payload
25
- response = payload[:response]
26
- response_body = begin
27
- JSON.parse(response.body)
28
- rescue StandardError
29
- response.body
30
- end
31
- duration = event.duration.round(2)
32
- {
33
- time: Time.zone.now.iso8601,
34
- params: payload[:params],
35
- response: response_body,
36
- exception: payload[:exception],
37
- exception_object: payload[:exception_object],
38
- request_id: payload[:request].request_id,
39
- remote_ip: payload[:request].remote_ip,
40
- ip: payload[:request].ip,
41
- ruby_version: RUBY_VERSION,
42
- rails_version: Rails.version,
43
- message: "#{payload[:method]} #{payload[:path]} - #{payload[:status]} #{response.message} (#{duration}ms)"
44
- }
45
- end
46
- end
47
- end