legion-logging 1.4.1 → 1.4.2

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: 87467334f127d64997e116d784a68d875c8180a6633dd068e4e095eb7e8bc22f
4
- data.tar.gz: a934447ca2a89f43d3f4993a1df8e879b15945b966b4ade4f29b4d6b2272762d
3
+ metadata.gz: 31ec07f7a93713fb708102528d4e61525a4c3b4fa39de510d29a454726b49436
4
+ data.tar.gz: 62a67fc723d1e865ef3e632d1987b6ce73c2fe9aa033686df5fe3b2fb89bc14c
5
5
  SHA512:
6
- metadata.gz: bb9ece1de3b070fb58417992daf22fdaf3e0021f8a45e486a6d5fa4bdca8536c9ed6bdaec8b867f8aef854b52a1496d462260c7cf31d1faae4b0769a91995ef2
7
- data.tar.gz: 00f6510d46e38bb7a638aace8818cdccdefe9bfb8c857ecc2d6b11a43f55461ea25bd56a37b0b325749971808491679160930ba11014a453d7fbd5b096d50368
6
+ metadata.gz: 5e0b2171b6ca1b1acbb3ad0f40cbd23a77bf5824a3b2f37a5c9b3484f7edf2cf9cf1a8dc23a9f0ed0acd426e139fb0d7ce13ac0a3ae2a77b3113dd0569cc6d53
7
+ data.tar.gz: e4e599809e26c6b7a0f9c1a81f05e390175cad0568b6b99f26888b675590972ff9148e27bc53f36461e1d6f09f83fcf7a818b01bd793098c5809910affabb0a2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Legion::Logging Changelog
2
2
 
3
+ ## [1.4.2] - 2026-03-28
4
+
5
+ ### Added
6
+ - `Legion::Logging::CategoryRegistry` module: extension-defined event category registration with `register_category`, `registered_categories`, `category_registered?`, and `category_info` methods
7
+ - `Legion::Logging.register_category` and `Legion::Logging.registered_categories` delegate methods on the top-level module
8
+ - `category:` keyword argument on `EventBuilder.build` — emits `category` field in structured log events when provided
9
+ - `SIEMExporter.format_for_elk` now includes `category` field when the event hash carries `:category` or `"category"`
10
+
3
11
  ## [1.4.1] - 2026-03-27
4
12
 
5
13
  ### Fixed
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Logging
5
+ module CategoryRegistry
6
+ VALID_NAME_PATTERN = /\A[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*\z/
7
+
8
+ class << self
9
+ def register_category(name, description: nil, expected_fields: [])
10
+ name = name.to_s
11
+ raise ArgumentError, "invalid category name: #{name.inspect}" unless name.match?(VALID_NAME_PATTERN)
12
+
13
+ registry[name] = {
14
+ name: name,
15
+ description: description,
16
+ expected_fields: Array(expected_fields)
17
+ }.freeze
18
+ name
19
+ end
20
+
21
+ def registered_categories
22
+ registry.dup.freeze
23
+ end
24
+
25
+ def category_registered?(name)
26
+ registry.key?(name.to_s)
27
+ end
28
+
29
+ def category_info(name)
30
+ registry[name.to_s]
31
+ end
32
+
33
+ def clear!
34
+ registry.clear
35
+ end
36
+
37
+ private
38
+
39
+ def registry
40
+ @registry ||= {}
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -13,7 +13,7 @@ module Legion
13
13
  BACKTRACE_FALLBACK_FRAMES = 20
14
14
 
15
15
  class << self
16
- def build(level:, message:, lex: nil, lex_segments: nil, context: nil, caller_offset: 2)
16
+ def build(level:, message:, lex: nil, lex_segments: nil, context: nil, category: nil, caller_offset: 2)
17
17
  event = base_fields(level, message)
18
18
  event[:lex] = derive_lex_source(lex, lex_segments)
19
19
  add_node(event)
@@ -21,6 +21,7 @@ module Legion
21
21
  add_exception_info(event, message)
22
22
  add_gem_info(event, event[:lex])
23
23
  event[:context] = context if context
24
+ event[:category] = category.to_s if category
24
25
  event.compact
25
26
  end
26
27
 
@@ -37,12 +37,17 @@ module Legion
37
37
  end
38
38
 
39
39
  def format_for_elk(event, index: 'legion')
40
- {
40
+ result = {
41
41
  '@timestamp' => Time.now.utc.iso8601,
42
42
  'index' => index,
43
43
  'message' => redact_phi(event.to_s),
44
44
  'source' => 'legion'
45
45
  }
46
+ if event.is_a?(Hash)
47
+ category = event[:category] || event['category']
48
+ result['category'] = category.to_s if category
49
+ end
50
+ result
46
51
  end
47
52
  end
48
53
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Logging
5
- VERSION = '1.4.1'
5
+ VERSION = '1.4.2'
6
6
  end
7
7
  end
@@ -7,6 +7,7 @@ require 'legion/logging/builder'
7
7
  require 'legion/logging/event_builder'
8
8
  require 'legion/logging/async_writer'
9
9
  require 'legion/logging/helper'
10
+ require 'legion/logging/category_registry'
10
11
 
11
12
  require 'json'
12
13
  require 'logger'
@@ -32,6 +33,14 @@ module Legion
32
33
  @exception_writer || DEFAULT_EXCEPTION_WRITER
33
34
  end
34
35
 
36
+ def register_category(name, description: nil, expected_fields: [])
37
+ CategoryRegistry.register_category(name, description: description, expected_fields: expected_fields)
38
+ end
39
+
40
+ def registered_categories
41
+ CategoryRegistry.registered_categories
42
+ end
43
+
35
44
  def setup(level: 'info', format: :text, async: true, **options)
36
45
  output(**options)
37
46
  log_level(level)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion-logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -61,6 +61,7 @@ files:
61
61
  - lib/legion/logging.rb
62
62
  - lib/legion/logging/async_writer.rb
63
63
  - lib/legion/logging/builder.rb
64
+ - lib/legion/logging/category_registry.rb
64
65
  - lib/legion/logging/event_builder.rb
65
66
  - lib/legion/logging/helper.rb
66
67
  - lib/legion/logging/logger.rb