From 21848ff91b29df14b8e78f1b1994ad2d2a671d2a Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 19 Jul 2022 09:38:31 -0500 Subject: [PATCH] Log in background thread File IO is fast, but can still block reactor. --- .rubocop.yml | 1 + lib/background_log.rb | 29 +++++++++++++++++++++++++++++ sgx_jmp.rb | 4 +++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 lib/background_log.rb diff --git a/.rubocop.yml b/.rubocop.yml index 325e600..f46799f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -29,6 +29,7 @@ Metrics/ParameterLists: Naming/MethodParameterName: AllowNamesEndingInNumbers: false AllowedNames: + - io - m - e - q diff --git a/lib/background_log.rb b/lib/background_log.rb new file mode 100644 index 0000000..617a4f1 --- /dev/null +++ b/lib/background_log.rb @@ -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 diff --git a/sgx_jmp.rb b/sgx_jmp.rb index ecd50ec..50c1764 100644 --- a/sgx_jmp.rb +++ b/sgx_jmp.rb @@ -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, -- 2.38.5