legion-logging 1.5.4 → 1.5.5

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: 3a7e958bdf135cd4798a6619992fd2661a9864b13dab2133c378d67ccea54380
4
- data.tar.gz: 280391287ca3a8e15f91979e63bdbb3f4f7bab3c0e71bcc1f47b9a4eac378cb0
3
+ metadata.gz: cd5e1bffbdc433aedb24653ea515080063cb456de0c5a0fd5a57cdbff91d371d
4
+ data.tar.gz: 0b015f1b0c5d12511f231bfa32325e2ebcc41ca902b92d8293bdcf6359d8a7ac
5
5
  SHA512:
6
- metadata.gz: 55b8db2c9e50ad4d9d91f10379821c33c0cacdeed46a1da16a23d49835108f65ab9d59305bd3c421219510932d58f684c2816c7b39e39d51dc36ad65396a8afe
7
- data.tar.gz: c7914b118692f0e2738ab5a68af4290e117b275b320a43a548ae5e85366f6f8cfec5f16f3c611f2b47a9f7e90a5446063f77c97ef3bb98a5e169a6dee177e9ad
6
+ metadata.gz: 0bad8e3a31fb86de2b1a2749457b506e7042606e7e060813a0adcaf81f2d0afdf8998e3ba57692fabe5814ab7efcb3dcadfb9c8e985a77b6f3c4e44aedcccf35
7
+ data.tar.gz: 83475ff76aae03a25c24e1b464695f68ef6b4514309e6290485e513066f3d9f4ff9367e2b87e087f89dd1f1b6b3fafa4176ca5fcae226224859356d23189a80f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Legion::Logging Changelog
2
2
 
3
+ ## [1.5.5] - 2026-05-27
4
+
5
+ ### Fixed
6
+ - `emit_tagged` (used by all Legion::Logging::Helper consumers) now routes through the async writer instead of doing synchronous IO#write — eliminates IO mutex contention across all consumer threads
7
+ - `fatal` level now routes through async writer consistently with all other levels
8
+ - `log_exception` now writes through async writer instead of direct `log.public_send`
9
+ - `Legion::Logging::Logger` defaults to `async: true`, ensuring all per-extension logger instances use non-blocking writes
10
+
3
11
  ## [1.5.4] - 2026-05-22
4
12
 
5
13
  ### Added
@@ -11,7 +11,7 @@ module Legion
11
11
  include Legion::Logging::Methods
12
12
  include Legion::Logging::Builder
13
13
 
14
- def initialize(level: 'info', log_file: nil, log_stdout: nil, lex: nil, trace: false, extended: false, trace_size: 4, format: :text, async: false, **opts)
14
+ def initialize(level: 'info', log_file: nil, log_stdout: nil, lex: nil, trace: false, extended: false, trace_size: 4, format: :text, async: true, **opts)
15
15
  @lex = lex
16
16
  set_log(logfile: log_file, log_stdout: log_stdout)
17
17
  log_level(level)
@@ -66,11 +66,9 @@ module Legion
66
66
  return unless log.level < 5
67
67
 
68
68
  message = yield if message.nil? && block_given?
69
- message = maybe_redact(message)
70
- raw = message
71
- message = Rainbow(message).darkred if @color
72
- log.fatal(message)
73
- fire_log_writer(:fatal, raw)
69
+ raw = maybe_redact(message)
70
+ formatted = format_message_for_level(:fatal, raw)
71
+ write_async_or_sync(:fatal, formatted, raw, writer_context: build_writer_context(:fatal, raw))
74
72
  end
75
73
 
76
74
  def unknown(message = nil)
@@ -89,8 +87,20 @@ module Legion
89
87
  formatted = format_message_for_level(level, raw)
90
88
 
91
89
  with_tagged_context(segments, method_ctx) do
92
- write_forced(level, formatted)
93
- fire_log_writer(level, raw) if %i[warn error fatal].include?(level)
90
+ ctx = %i[warn error fatal].include?(level) ? build_writer_context(level, raw) : nil
91
+ writer = @async_writer
92
+ caller_trace = capture_runner_trace_for_async
93
+ if writer&.alive?
94
+ writer.push(AsyncWriter::LogEntry.new(
95
+ level: level, message: formatted, writer_context: ctx,
96
+ segments: Thread.current[:legion_log_segments],
97
+ method_ctx: Thread.current[:legion_log_method],
98
+ caller_trace: caller_trace
99
+ ))
100
+ else
101
+ with_caller_trace(caller_trace) { write_forced(level, formatted) }
102
+ fire_log_writer(level, raw) if ctx
103
+ end
94
104
  end
95
105
  end
96
106
 
@@ -104,11 +114,12 @@ module Legion
104
114
  source_code_uri: nil, handled: false, payload_summary: nil,
105
115
  task_id: nil, backtrace_limit: nil, **extra)
106
116
  level = level.to_sym if level.respond_to?(:to_sym)
107
- # 1. Log human-readable line + backtrace to stdout/file (bypass writer callbacks)
117
+ # 1. Log human-readable line + backtrace via async writer
108
118
  msg = exception.respond_to?(:message) ? exception.message : exception.to_s
109
119
  msg = maybe_redact(msg)
110
120
  msg = build_exception_log_message(exception, msg, backtrace_limit)
111
- log.public_send(level, msg) if respond_to?(:log) && log.respond_to?(level)
121
+ formatted = format_message_for_level(level, msg)
122
+ write_async_or_sync(level, formatted, msg)
112
123
 
113
124
  # 2. Build rich exception event
114
125
  event = Legion::Logging::EventBuilder.build_exception(
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Logging
5
- VERSION = '1.5.4'
5
+ VERSION = '1.5.5'
6
6
  end
7
7
  end
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.5.4
4
+ version: 1.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity