diff --git a/lib/logster/base_store.rb b/lib/logster/base_store.rb index bd1d24d5..126525e7 100644 --- a/lib/logster/base_store.rb +++ b/lib/logster/base_store.rb @@ -156,7 +156,7 @@ def report(severity, progname, msg, opts = {}) msg = truncate_message(msg) message = Logster::Message.new(severity, progname, msg, opts[:timestamp], count: opts[:count]) - env = opts[:env] || {} + env = opts[:env]&.dup || {} backtrace = opts[:backtrace] if Hash === env && env[:backtrace] # Special - passing backtrace through env diff --git a/test/logster/test_base_store.rb b/test/logster/test_base_store.rb index 201b5b14..9d04909f 100644 --- a/test/logster/test_base_store.rb +++ b/test/logster/test_base_store.rb @@ -176,4 +176,16 @@ def test_log_message_is_truncated_when_above_maximum_message_length ensure Logster.config.maximum_message_length = orig end + + def test_chained_loggers_shouldnt_mutate_env_passed_to_them + logger = Logster::Logger.new(@store) + other_store = Logster::TestStore.new + other_logger = Logster::Logger.new(other_store) + logger.chain(other_logger) + logger.add(Logger::WARN, "this is warning", '', { env: { backtrace: '11' } }) + [@store, other_store].each do |store| + assert_equal('11', store.reported.first.backtrace) + refute_includes(store.reported.first.env.keys.map(&:to_sym), :backtrace) + end + end end