inst-wide-logger 1.0.1 → 1.2.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: 1330118e6a708256a1bf74fe82a977fb04b654066699afe8b07038849721de61
4
- data.tar.gz: 82793852255e6746b79f576ade3f9caecfaeac9548309d8b01d5ee1da32d0480
3
+ metadata.gz: 48eed6b5cb7f9b36589aaf6aac78b8ab88a7dcb6e44cfd618012838816312cb5
4
+ data.tar.gz: faa3e37c7f0537513f174f7f1c8bcd374de6827a7bcff86bb23cd4f1a40f3cd3
5
5
  SHA512:
6
- metadata.gz: a58d0ea1188b30dca8bbe3a146ad79888b7444bdf28da8631ee5e56e5d154afc45ed1d7530870bac1899b32ad1b1d85e8f1c3cf5de9fd665166121e91f6dfe4e
7
- data.tar.gz: 4b0e1389461f57b492f5041d20345841b18259788c0f760439dd2608f4c16e6f005922cbee2581873b872a36402a3a2e4d17593056c737d9908039086008b447
6
+ metadata.gz: 2950404c977ce06feb0360d6c878b60345c169b458beebb087815df10d2599c945ac6751dca23f349cdf716aa98144945e2116efe17db12fc12364abd667873a
7
+ data.tar.gz: f8708a57eaa0d58bf04049382139a9a49e6a4ce59ae446b18cbb7c6e6fbed331a2d697baf5051e6e9ace4a3a4328d623bde9599013458e9684b47ccd046f28a4
data/.rubocop.yml ADDED
@@ -0,0 +1,15 @@
1
+ Style/FormatStringToken:
2
+ Enabled: false
3
+
4
+ Metrics/BlockLength:
5
+ Exclude:
6
+ - 'spec/**/*'
7
+
8
+ Metrics/MethodLength:
9
+ Max: 15
10
+
11
+ Metrics/AbcSize:
12
+ Max: 18
13
+
14
+ Style/Documentation:
15
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.2.0] - 2026-04-16
4
+
5
+ ### Added
6
+
7
+ - `WideLogger::DowngradingToDebugLogger` - a logger wrapper that downgrades log levels at or below a configurable threshold to `debug`
8
+ - Nested metadata interpolation in message templates using dot notation (e.g. `%<job.tag>s`)
9
+
10
+ ## [1.1.0] - 2026-04-01
11
+
12
+ ### Added
13
+
14
+ - `WideLogger::WrapOptions` struct for structured options (`metadata`, `error_metadata`, `message`)
15
+ - Message template support in `wrap` with `%{variable}` interpolation from logging context
16
+ - Error metadata support: additional metadata added to context only on exception
17
+ - Configurable default message templates per event type via `config.wide_logger.default_messages` or `WideLogger.default_messages`
18
+ - `railties` as a runtime dependency
19
+
20
+ ### Changed
21
+
22
+ - `WideLogger.wrap` now accepts `opts:` keyword argument (`WrapOptions`) instead of `metadata:`
23
+ - Event types are now configurable via Railtie (`config.wide_logger.event_types`) or `WideLogger.custom_event_types`
24
+
3
25
  ## [1.0.1] - 2026-04-01
4
26
 
5
27
  ### Added
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+
5
+ module WideLogger
6
+ class DowngradingToDebugLogger < SimpleDelegator
7
+ LEVELS = %i[info warn error fatal unknown].freeze
8
+
9
+ def initialize(logger, threshold:)
10
+ super(logger)
11
+ threshold_index = LEVELS.index(threshold)
12
+ LEVELS[0..threshold_index].each do |level|
13
+ define_singleton_method(level) do |msg = nil, &block|
14
+ __getobj__.debug(msg, &block)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WideLogger
4
+ class Railtie < Rails::Railtie
5
+ config.wide_logger = ActiveSupport::OrderedOptions.new
6
+ config.wide_logger.event_types = {}
7
+ config.wide_logger.default_messages = {}
8
+
9
+ initializer 'wide_logger.configure' do |app|
10
+ WideLogger.custom_event_types = app.config.wide_logger.event_types
11
+ WideLogger.default_messages = app.config.wide_logger.default_messages
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WideLogger
4
- VERSION = "1.0.1"
4
+ VERSION = "1.2.0"
5
5
  end
@@ -1,27 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WideLogger
4
- EVENT_TYPES = {
5
- web_request: 'canonical_request_summary',
4
+ DEFAULT_EVENT_TYPES = {
5
+ web_request: 'canonical_web_request_summary',
6
6
  job: 'canonical_job_summary',
7
7
  sqs: 'canonical_sqs_summary'
8
8
  }.freeze
9
9
 
10
+ INTERPOLATION_PATTERN = /%(?:\{([^}]+)\}|<([^>]+)>([a-zA-Z]))/
11
+
12
+ WrapOptions = Struct.new(:metadata, :error_metadata, :message, keyword_init: true) do
13
+ def initialize(metadata: {}, error_metadata: {}, message: nil)
14
+ super
15
+ end
16
+ end
17
+
10
18
  class << self
11
- def wrap(type:, metadata: {})
12
- event_type = EVENT_TYPES.fetch(type)
19
+ def custom_event_types=(value)
20
+ @custom_event_types = value
21
+ @event_types = nil
22
+ end
23
+
24
+ def custom_event_types
25
+ @custom_event_types ||= {}
26
+ end
27
+
28
+ def event_types
29
+ @event_types ||= DEFAULT_EVENT_TYPES.merge(custom_event_types).freeze
30
+ end
31
+
32
+ attr_writer :default_messages
33
+
34
+ def default_messages
35
+ @default_messages ||= {}
36
+ end
37
+
38
+ def wrap(type:, opts: WrapOptions.new)
39
+ event_type = event_types.fetch(type)
13
40
 
14
41
  Rails.logger.add_metadata(
15
42
  log_event_type: event_type,
16
- **metadata
43
+ **opts.metadata
17
44
  )
18
45
 
19
46
  result = yield
20
47
 
21
- emit_event(event_type)
48
+ emit_event(event_type, opts.message || default_messages[type])
22
49
  result
23
50
  rescue StandardError => e
24
- emit_event(event_type, e)
51
+ Rails.logger.add_metadata(**opts.error_metadata) unless opts.error_metadata.empty?
52
+ emit_event(event_type, nil, e)
25
53
  raise
26
54
  ensure
27
55
  Rails.logger.clear_metadata!
@@ -33,12 +61,33 @@ module WideLogger
33
61
 
34
62
  private
35
63
 
36
- def emit_event(event_type, e = nil)
37
- if e
38
- Rails.logger.error("#{event_type} failed with error: #{e.message}")
64
+ def emit_event(event_type, message, error = nil)
65
+ if error
66
+ Rails.logger.error("#{event_type} failed with error: #{error.message}")
67
+ elsif message
68
+ Rails.logger.info(interpolate_message(message))
39
69
  else
40
70
  Rails.logger.info(event_type)
41
71
  end
42
72
  end
73
+
74
+ def interpolate_message(message)
75
+ metadata = Rails.logger.current_metadata
76
+ message.gsub(INTERPOLATION_PATTERN) do |match|
77
+ value = resolve_key(metadata, $1 || $2)
78
+ next match if value.nil?
79
+
80
+ $1 ? value.to_s : format("%#{$3}", value)
81
+ end
82
+ end
83
+
84
+ def resolve_key(metadata, key)
85
+ if key.include?('.')
86
+ keys = key.split('.').map(&:to_sym)
87
+ metadata.dig(*keys)
88
+ else
89
+ metadata[key.to_sym]
90
+ end
91
+ end
43
92
  end
44
93
  end
data/lib/wide_logger.rb CHANGED
@@ -3,4 +3,6 @@
3
3
  require 'paul_bunyan'
4
4
  require_relative 'wide_logger/version'
5
5
  require_relative 'wide_logger/wide_logger'
6
- require_relative 'wide_logger/dev_json_formatter'
6
+ require_relative 'wide_logger/downgrading_to_debug_logger'
7
+ require_relative 'wide_logger/dev_json_formatter'
8
+ require_relative 'wide_logger/railtie' if defined?(Rails::Railtie)
data/wide_logger.gemspec CHANGED
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
 
29
29
  spec.add_dependency 'paul_bunyan', '~> 2.1'
30
+ spec.add_dependency 'railties', '>= 6.0'
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inst-wide-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zoltan Hegedus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-01 00:00:00.000000000 Z
11
+ date: 2026-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: paul_bunyan
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: railties
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '6.0'
27
41
  description:
28
42
  email:
29
43
  - zoltan.hegedus@instructure.com
@@ -32,6 +46,7 @@ extensions: []
32
46
  extra_rdoc_files: []
33
47
  files:
34
48
  - ".rspec"
49
+ - ".rubocop.yml"
35
50
  - CHANGELOG.md
36
51
  - Gemfile
37
52
  - README.md
@@ -39,6 +54,8 @@ files:
39
54
  - lib/inst-wide-logger.rb
40
55
  - lib/wide_logger.rb
41
56
  - lib/wide_logger/dev_json_formatter.rb
57
+ - lib/wide_logger/downgrading_to_debug_logger.rb
58
+ - lib/wide_logger/railtie.rb
42
59
  - lib/wide_logger/version.rb
43
60
  - lib/wide_logger/wide_logger.rb
44
61
  - wide_logger.gemspec