semantic_logger 4.18.0 → 5.0.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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +42 -81
  3. data/Rakefile +10 -3
  4. data/lib/semantic_logger/appender/async.rb +86 -173
  5. data/lib/semantic_logger/appender/cloudwatch_logs.rb +4 -4
  6. data/lib/semantic_logger/appender/elasticsearch.rb +6 -182
  7. data/lib/semantic_logger/appender/elasticsearch_base.rb +212 -0
  8. data/lib/semantic_logger/appender/elasticsearch_http.rb +2 -2
  9. data/lib/semantic_logger/appender/file.rb +20 -4
  10. data/lib/semantic_logger/appender/graylog.rb +2 -2
  11. data/lib/semantic_logger/appender/http.rb +27 -2
  12. data/lib/semantic_logger/appender/io.rb +8 -4
  13. data/lib/semantic_logger/appender/kafka.rb +2 -2
  14. data/lib/semantic_logger/appender/loki.rb +2 -4
  15. data/lib/semantic_logger/appender/mongodb.rb +3 -6
  16. data/lib/semantic_logger/appender/new_relic_logs.rb +2 -2
  17. data/lib/semantic_logger/appender/open_telemetry.rb +8 -6
  18. data/lib/semantic_logger/appender/opensearch.rb +35 -0
  19. data/lib/semantic_logger/appender/rabbitmq.rb +3 -3
  20. data/lib/semantic_logger/appender/sentry_ruby.rb +2 -2
  21. data/lib/semantic_logger/appender/splunk.rb +2 -2
  22. data/lib/semantic_logger/appender/splunk_http.rb +3 -3
  23. data/lib/semantic_logger/appender/syslog.rb +5 -4
  24. data/lib/semantic_logger/appender/tcp.rb +2 -2
  25. data/lib/semantic_logger/appender/udp.rb +2 -2
  26. data/lib/semantic_logger/appender/wrapper.rb +4 -4
  27. data/lib/semantic_logger/appender.rb +30 -19
  28. data/lib/semantic_logger/appenders.rb +26 -5
  29. data/lib/semantic_logger/base.rb +100 -21
  30. data/lib/semantic_logger/concerns/compatibility.rb +2 -2
  31. data/lib/semantic_logger/core_ext/process.rb +34 -0
  32. data/lib/semantic_logger/formatters/base.rb +46 -7
  33. data/lib/semantic_logger/formatters/color.rb +6 -3
  34. data/lib/semantic_logger/formatters/default.rb +6 -4
  35. data/lib/semantic_logger/formatters/ecs.rb +151 -0
  36. data/lib/semantic_logger/formatters/fluentd.rb +15 -4
  37. data/lib/semantic_logger/formatters/json.rb +6 -1
  38. data/lib/semantic_logger/formatters/logfmt.rb +2 -2
  39. data/lib/semantic_logger/formatters/loki.rb +4 -4
  40. data/lib/semantic_logger/formatters/open_telemetry.rb +15 -5
  41. data/lib/semantic_logger/formatters/pattern.rb +235 -0
  42. data/lib/semantic_logger/formatters/raw.rb +2 -2
  43. data/lib/semantic_logger/formatters/signalfx.rb +2 -2
  44. data/lib/semantic_logger/formatters/syslog.rb +14 -3
  45. data/lib/semantic_logger/formatters/syslog_cee.rb +1 -1
  46. data/lib/semantic_logger/formatters.rb +2 -0
  47. data/lib/semantic_logger/log.rb +18 -4
  48. data/lib/semantic_logger/logger.rb +2 -2
  49. data/lib/semantic_logger/metric/new_relic.rb +2 -2
  50. data/lib/semantic_logger/metric/signalfx.rb +2 -2
  51. data/lib/semantic_logger/metric/statsd.rb +2 -2
  52. data/lib/semantic_logger/processor.rb +21 -0
  53. data/lib/semantic_logger/queue_processor.rb +369 -0
  54. data/lib/semantic_logger/reporters/minitest.rb +4 -4
  55. data/lib/semantic_logger/semantic_logger.rb +103 -11
  56. data/lib/semantic_logger/subscriber.rb +15 -2
  57. data/lib/semantic_logger/sync_processor.rb +25 -3
  58. data/lib/semantic_logger/test/capture_log_events.rb +2 -2
  59. data/lib/semantic_logger/test/minitest.rb +8 -4
  60. data/lib/semantic_logger/test/rspec.rb +249 -0
  61. data/lib/semantic_logger/utils.rb +83 -4
  62. data/lib/semantic_logger/version.rb +1 -1
  63. data/lib/semantic_logger.rb +9 -0
  64. metadata +17 -8
  65. data/lib/semantic_logger/appender/async_batch.rb +0 -93
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.18.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-04-10 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: concurrent-ruby
@@ -23,6 +23,9 @@ dependencies:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
25
  version: '1.0'
26
+ description: Semantic Logger is a high-performance, asynchronous structured logging
27
+ framework for Ruby & Rails. It logs to multiple destinations via a background thread,
28
+ preserving structured (semantic) payloads.
26
29
  executables: []
27
30
  extensions: []
28
31
  extra_rdoc_files: []
@@ -34,10 +37,10 @@ files:
34
37
  - lib/semantic_logger/ansi_colors.rb
35
38
  - lib/semantic_logger/appender.rb
36
39
  - lib/semantic_logger/appender/async.rb
37
- - lib/semantic_logger/appender/async_batch.rb
38
40
  - lib/semantic_logger/appender/bugsnag.rb
39
41
  - lib/semantic_logger/appender/cloudwatch_logs.rb
40
42
  - lib/semantic_logger/appender/elasticsearch.rb
43
+ - lib/semantic_logger/appender/elasticsearch_base.rb
41
44
  - lib/semantic_logger/appender/elasticsearch_http.rb
42
45
  - lib/semantic_logger/appender/file.rb
43
46
  - lib/semantic_logger/appender/graylog.rb
@@ -51,6 +54,7 @@ files:
51
54
  - lib/semantic_logger/appender/new_relic.rb
52
55
  - lib/semantic_logger/appender/new_relic_logs.rb
53
56
  - lib/semantic_logger/appender/open_telemetry.rb
57
+ - lib/semantic_logger/appender/opensearch.rb
54
58
  - lib/semantic_logger/appender/rabbitmq.rb
55
59
  - lib/semantic_logger/appender/sentry.rb
56
60
  - lib/semantic_logger/appender/sentry_ruby.rb
@@ -63,12 +67,14 @@ files:
63
67
  - lib/semantic_logger/appenders.rb
64
68
  - lib/semantic_logger/base.rb
65
69
  - lib/semantic_logger/concerns/compatibility.rb
70
+ - lib/semantic_logger/core_ext/process.rb
66
71
  - lib/semantic_logger/core_ext/thread.rb
67
72
  - lib/semantic_logger/debug_as_trace_logger.rb
68
73
  - lib/semantic_logger/formatters.rb
69
74
  - lib/semantic_logger/formatters/base.rb
70
75
  - lib/semantic_logger/formatters/color.rb
71
76
  - lib/semantic_logger/formatters/default.rb
77
+ - lib/semantic_logger/formatters/ecs.rb
72
78
  - lib/semantic_logger/formatters/fluentd.rb
73
79
  - lib/semantic_logger/formatters/json.rb
74
80
  - lib/semantic_logger/formatters/logfmt.rb
@@ -76,6 +82,7 @@ files:
76
82
  - lib/semantic_logger/formatters/new_relic_logs.rb
77
83
  - lib/semantic_logger/formatters/one_line.rb
78
84
  - lib/semantic_logger/formatters/open_telemetry.rb
85
+ - lib/semantic_logger/formatters/pattern.rb
79
86
  - lib/semantic_logger/formatters/raw.rb
80
87
  - lib/semantic_logger/formatters/signalfx.rb
81
88
  - lib/semantic_logger/formatters/syslog.rb
@@ -89,6 +96,7 @@ files:
89
96
  - lib/semantic_logger/metric/signalfx.rb
90
97
  - lib/semantic_logger/metric/statsd.rb
91
98
  - lib/semantic_logger/processor.rb
99
+ - lib/semantic_logger/queue_processor.rb
92
100
  - lib/semantic_logger/reporters/minitest.rb
93
101
  - lib/semantic_logger/semantic_logger.rb
94
102
  - lib/semantic_logger/subscriber.rb
@@ -96,6 +104,7 @@ files:
96
104
  - lib/semantic_logger/sync_processor.rb
97
105
  - lib/semantic_logger/test/capture_log_events.rb
98
106
  - lib/semantic_logger/test/minitest.rb
107
+ - lib/semantic_logger/test/rspec.rb
99
108
  - lib/semantic_logger/utils.rb
100
109
  - lib/semantic_logger/version.rb
101
110
  homepage: https://logger.rocketjob.io
@@ -103,8 +112,9 @@ licenses:
103
112
  - Apache-2.0
104
113
  metadata:
105
114
  bug_tracker_uri: https://github.com/reidmorrison/semantic_logger/issues
115
+ changelog_uri: https://github.com/reidmorrison/semantic_logger/releases
106
116
  documentation_uri: https://logger.rocketjob.io
107
- source_code_uri: https://github.com/reidmorrison/semantic_logger/tree/v4.18.0
117
+ source_code_uri: https://github.com/reidmorrison/semantic_logger/tree/v5.0.0
108
118
  rubygems_mfa_required: 'true'
109
119
  rdoc_options: []
110
120
  require_paths:
@@ -113,15 +123,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
123
  requirements:
114
124
  - - ">="
115
125
  - !ruby/object:Gem::Version
116
- version: '2.7'
126
+ version: '3.2'
117
127
  required_rubygems_version: !ruby/object:Gem::Requirement
118
128
  requirements:
119
129
  - - ">="
120
130
  - !ruby/object:Gem::Version
121
131
  version: '0'
122
132
  requirements: []
123
- rubygems_version: 3.6.2
133
+ rubygems_version: 3.6.9
124
134
  specification_version: 4
125
- summary: Feature rich logging framework, and replacement for existing Ruby & Rails
126
- loggers.
135
+ summary: High-performance, asynchronous structured logging framework for Ruby & Rails.
127
136
  test_files: []
@@ -1,93 +0,0 @@
1
- module SemanticLogger
2
- module Appender
3
- # Log asynchronously in batches using a separate thread.
4
- #
5
- # Log messages are grouped up and only logged when:
6
- # * The number of queued messages is exceeded.
7
- # * Or, the appropriate amount of time has passed since the last batch was sent.
8
- class AsyncBatch < Async
9
- attr_accessor :batch_size, :batch_seconds
10
- attr_reader :signal
11
-
12
- # Batching Appender proxy for appenders that support batches.
13
- #
14
- # Parameters:
15
- # batch_size: [Integer]
16
- # Maximum number of messages to batch up before sending.
17
- # Default: 300
18
- #
19
- # batch_seconds: [Integer]
20
- # Maximum number of seconds between sending batches.
21
- # Default: 5
22
- #
23
- # See SemanticLogger::Appender::Async for other paramaters
24
- #
25
- # Note:
26
- # * `lag_check_interval` is not applicable to batches, since the first message of every batch
27
- # is the oldest and is always checked to see if the lag interval has been exceeded.
28
- def initialize(appender:,
29
- max_queue_size: 10_000,
30
- lag_threshold_s: 30,
31
- batch_size: 300,
32
- batch_seconds: 5)
33
- @batch_size = batch_size
34
- @batch_seconds = batch_seconds
35
- @signal = Concurrent::Event.new
36
- super(
37
- appender: appender,
38
- max_queue_size: max_queue_size,
39
- lag_threshold_s: lag_threshold_s
40
- )
41
-
42
- return if appender.respond_to?(:batch)
43
-
44
- raise(ArgumentError, "#{appender.class.name} does not support batching. It must implement #batch")
45
- end
46
-
47
- # Add log message for processing.
48
- def log(log)
49
- result = super
50
- # Wake up the processing thread since the number of queued messages has been exceeded.
51
- signal.set if queue.size >= batch_size
52
- result
53
- end
54
-
55
- private
56
-
57
- # Separate thread for batching up log messages before writing.
58
- def process_messages
59
- loop do
60
- # Wait for batch interval or number of messages to be exceeded.
61
- signal.wait(batch_seconds)
62
-
63
- logs = []
64
- messages = []
65
- first = true
66
- message_count = queue.length
67
- message_count.times do
68
- # Queue#pop(true) raises an exception when there are no more messages, which is considered expensive.
69
- message = queue.pop
70
- if message.is_a?(Log)
71
- logs << message
72
- if first
73
- check_lag(message)
74
- first = false
75
- end
76
- else
77
- messages << message
78
- end
79
- end
80
- appender.batch(logs) if logs.size.positive?
81
- messages.each { |message| process_message(message) }
82
- signal.reset unless queue.size >= batch_size
83
- end
84
- end
85
-
86
- def submit_request(command)
87
- # Wake up the processing thread to process this command immediately.
88
- signal.set
89
- super
90
- end
91
- end
92
- end
93
- end