background_log.rb
1# frozen_string_literal: true
2
3# Subclass IO because Logger does an is_a? check
4class BackgroundLog < IO
5 def initialize(io)
6 @io = io
7 @q = Queue.new
8 thread
9 at_exit do
10 @q << :done
11 thread.join
12 end
13 end
14
15 def thread
16 @thread ||= Thread.new do
17 loop do
18 m = @q.pop
19 break if m == :done
20
21 @io.write m
22 end
23 end
24 end
25
26 def write(s)
27 @q << s
28 end
29end