~singpolyma/sgx-jmp

21848ff91b29df14b8e78f1b1994ad2d2a671d2a — Stephen Paul Weber 1 year, 9 months ago 2aa1030
Log in background thread

File IO is fast, but can still block reactor.
3 files changed, 33 insertions(+), 1 deletions(-)

M .rubocop.yml
A lib/background_log.rb
M sgx_jmp.rb
M .rubocop.yml => .rubocop.yml +1 -0
@@ 29,6 29,7 @@ Metrics/ParameterLists:
Naming/MethodParameterName:
  AllowNamesEndingInNumbers: false
  AllowedNames:
    - io
    - m
    - e
    - q

A lib/background_log.rb => lib/background_log.rb +29 -0
@@ 0,0 1,29 @@
# frozen_string_literal: true

# Subclass IO because Logger does an is_a? check
class BackgroundLog < IO
	def initialize(io)
		@io = io
		@q = Queue.new
		thread
		at_exit do
			@q << :done
			thread.join
		end
	end

	def thread
		@thread ||= Thread.new do
			loop do
				m = @q.pop
				break if m == :done

				@io.write m
			end
		end
	end

	def write(s)
		@q << s
	end
end

M sgx_jmp.rb => sgx_jmp.rb +3 -1
@@ 14,8 14,10 @@ require "ruby-bandwidth-iris"
require "sentry-ruby"
require "statsd-instrument"

require_relative "lib/background_log"

$stdout.sync = true
LOG = Ougai::Logger.new($stdout)
LOG = Ougai::Logger.new(BackgroundLog.new($stdout))
LOG.level = ENV.fetch("LOG_LEVEL", "info")
LOG.formatter = Ougai::Formatters::Readable.new(
	nil,