diff --git a/lib/async/reactor.rb b/lib/async/reactor.rb index 50fbca1d..f8c48e2c 100644 --- a/lib/async/reactor.rb +++ b/lib/async/reactor.rb @@ -75,6 +75,10 @@ def logger @logger || Event::Console.logger end + def logger= + @logger = logger + end + def to_s "<#{self.description} stopped=#{@stopped}>" end diff --git a/lib/async/task.rb b/lib/async/task.rb index c8be14a3..61abf77c 100644 --- a/lib/async/task.rb +++ b/lib/async/task.rb @@ -76,7 +76,11 @@ def to_s end def logger - @logger ||= @parent.logger + @logger || @parent&.logger + end + + def logger= + @logger = logger end # @attr ios [Reactor] The reactor the task was created within. diff --git a/spec/async/logger_spec.rb b/spec/async/logger_spec.rb index c59a40a9..8088900f 100644 --- a/spec/async/logger_spec.rb +++ b/spec/async/logger_spec.rb @@ -23,21 +23,45 @@ require 'event/capture' RSpec.describe 'Async.logger' do + let(:name) {"nested"} + let(:message) {"Talk is cheap. Show me the code."} + let(:capture) {Event::Capture.new} - let(:logger) {Event::Logger.new(capture, name: "Nested")} + let(:logger) {Event::Logger.new(capture, name: name)} it "can use nested logger" do - logger.verbose! - Async(logger: logger) do |task| expect(task.logger).to be == logger - logger.warn "Thar be the dragons!" + logger.warn message end expect(capture.events.last).to include({ severity: :warn, - name: "Nested", - subject: "Thar be the dragons!", + name: name, + subject: message, }) end + + it "can change nested logger" do + Async(logger: logger) do |task| + expect(task.logger).to be == logger + + task.logger = nil + expect(task.logger).to be == task.reactor.logger + end + end + + it "can use parent logger" do + Async(logger: logger) do |parent| + child = parent.async{|task| task.yield} + + expect(parent.logger).to be == logger + expect(child.logger).to be == logger + + parent.logger = nil + + expect(parent.logger).to be == parent.reactor.logger + expect(child.logger).to be == parent.reactor.logger + end + end end