diff --git a/lib/rackstash/logger.rb b/lib/rackstash/logger.rb index 5d320d2..7ce4adf 100644 --- a/lib/rackstash/logger.rb +++ b/lib/rackstash/logger.rb @@ -222,14 +222,16 @@ module Rackstash # # @param severity [Integer] The log severity. One of the {SEVERITIES} # consants. - # @param msg [#to_s, Exception, nil] The log message. A `String` or - # `Exception`. If unset, we try to use the return value of the optional - # block. + # @param msg [#to_s, ::Hash, Exception, nil] The log message. If unset, we + # try, to use the return value of the optional block. If we get a `String` + # or `Exception`, we log a new {Message}. If it's a Hash, we deep_merge it + # into the current buffer's fields instead. # @param progname [String, nil] The program name. Can be omitted. It's # treated as a message if no `msg` and `block` are given. # @yield If `message` is `nil`, we yield to the block to get a message # string. - # @return [String] The resolved unformatted message string + # @return [Message, ::Hash, nil] The merged Hash, or the resolved {Message} + # or `nil` if nothing was logged def add(severity, msg = nil, progname = nil) severity = severity ? Integer(severity) : UNKNOWN return if @level > severity @@ -244,21 +246,19 @@ module Rackstash end end - time = Time.now.utc.freeze - formatted_msg = formatter.call( - severity_label(severity), - time, - progname, + case msg + when Hash, Rackstash::Fields::Hash + buffer.fields.deep_merge!(msg) msg - ) - buffer.add_message Message.new( - formatted_msg, - time: time, - progname: progname, - severity: severity - ) - - formatted_msg + else + time = Time.now.utc.freeze + buffer.add_message Message.new( + formatter.call(Rackstash.severity_label(severity), time, progname, msg), + time: time, + progname: progname, + severity: severity + ) + end end alias log add @@ -290,9 +290,5 @@ module Rackstash def buffer buffer_stack.current end - - def severity_label(severity) - SEVERITY_LABELS[severity] || SEVERITY_LABELS.last - end end end diff --git a/spec/rackstash/logger_spec.rb b/spec/rackstash/logger_spec.rb index ccadcdf..6df0b29 100644 --- a/spec/rackstash/logger_spec.rb +++ b/spec/rackstash/logger_spec.rb @@ -138,8 +138,7 @@ describe Rackstash::Logger do let(:buffer) { double('Rackstash::Buffer').tap do |buffer| - expect(buffer).to receive(:add_message) { |message| messages << message } - .at_least(:once) + allow(buffer).to receive(:add_message) { |message| messages << message } end } @@ -153,12 +152,9 @@ describe Rackstash::Logger do before do class_double('Rackstash::Message').as_stubbed_const.tap do |klass| - expect(klass).to receive(:new) { |msg, **kwargs| { message: msg, **kwargs } } - .at_least(:once) + allow(klass).to receive(:new) { |msg, **kwargs| { message: msg, **kwargs } } end - expect(logger).to receive(:buffer_stack) - .at_least(:once) - .and_return(buffer_stack) + allow(logger).to receive(:buffer_stack).and_return(buffer_stack) end it 'sets the current time as UTC to the message' do @@ -288,6 +284,16 @@ describe Rackstash::Logger do ) end + it 'merges fields if message is a Hash' do + fields = instance_double('Rackstash::Fields::Hash') + expect(buffer).to receive(:fields).and_return(fields) + expect(fields).to receive(:deep_merge!).with(foo: 'bar') + + expect(buffer).not_to receive(:add_message) + + expect(logger.add(0, { foo: 'bar' })).to eql(foo: 'bar') + end + it 'can use debug shortcut' do expect(logger).to receive(:add).with(0, 'Debug').and_call_original logger.debug('Debug')