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