Skip to content

Commit 6dde52e

Browse files
committed
Switched capture strategy directly adding spy appender (#3)
Reworked log capture in setting_with_deprecated_alias_spec to use Logger's addAppender and a spy appender implementation. This leverages the idea to don't reconfigure the Log4J with a custom build configuration, but simply adding an appender that could spy the appended lines to a logger.
1 parent d9bdccb commit 6dde52e

File tree

1 file changed

+44
-20
lines changed

1 file changed

+44
-20
lines changed

logstash-core/spec/logstash/settings/setting_with_deprecated_alias_spec.rb

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
require "spec_helper"
1919
require "logstash/settings"
20+
java_import org.apache.logging.log4j.core.appender.AbstractAppender
2021

2122
describe LogStash::Setting::SettingWithDeprecatedAlias do
2223
let(:canonical_setting_name) { "canonical.setting" }
@@ -27,21 +28,38 @@
2728
let(:settings) { LogStash::Settings.new }
2829
let(:canonical_setting) { LogStash::Setting::StringSetting.new(canonical_setting_name, default_value, true) }
2930

30-
log_spy = nil
31-
log_ctx = nil
31+
class CustomAppender < AbstractAppender
3232

33-
def log_ctx
34-
@log_ctx
35-
end
33+
attr_reader :events_collector
34+
35+
def initialize(events)
36+
super("CustomCaptorAppender", nil, nil, true, org.apache.logging.log4j.core.config.Property::EMPTY_ARRAY)
37+
@events_collector = events
38+
end
3639

37-
def log_spy
38-
@log_spy
40+
# override the append to catch all the calls and collect the events
41+
def append(log_event)
42+
@events_collector << log_event.message.formatted_message
43+
end
3944
end
4045

46+
let(:events) { [] }
47+
4148
before(:each) do
42-
# Initialization of appender and logger use to spy, need to be freshly recreated on each test is context shutdown is used.
43-
@log_ctx = setup_logger_spy
44-
@log_spy = retrieve_logger_spy(@log_ctx)
49+
java_import org.apache.logging.log4j.LogManager
50+
logger = LogManager.getLogger("org.logstash.settings.DeprecatedAlias")
51+
deprecated_logger = LogManager.getLogger("org.logstash.deprecation.settings.DeprecatedAlias")
52+
53+
@custom_appender = CustomAppender.new(events).tap {|appender| appender.start }
54+
55+
java_import org.apache.logging.log4j.Level
56+
logger.addAppender(@custom_appender)
57+
deprecated_logger.addAppender(@custom_appender)
58+
# had to set level after appending as it was "error" for some reason
59+
logger.setLevel(Level::INFO)
60+
deprecated_logger.setLevel(Level::INFO)
61+
62+
expect(@custom_appender.started?).to be_truthy
4563

4664
allow(LogStash::Settings).to receive(:logger).and_return(double("SettingsLogger").as_null_object)
4765
allow(LogStash::Settings).to receive(:deprecation_logger).and_return(double("SettingsDeprecationLogger").as_null_object)
@@ -50,9 +68,15 @@ def log_spy
5068
end
5169

5270
after(:each) do
53-
@log_ctx.close
54-
@log_spy = nil
55-
@log_ctx = nil
71+
events.clear
72+
java_import org.apache.logging.log4j.LogManager
73+
logger = LogManager.getLogger("org.logstash.settings.DeprecatedAlias")
74+
deprecated_logger = LogManager.getLogger("org.logstash.deprecation.settings.DeprecatedAlias")
75+
# The Logger's AbstractConfiguration contains a cache of Appender, by class name. The cache is updated
76+
# iff is absent, so to make subsequent add_appender effective we have cleanup on teardown, else the new
77+
# appender instance is simply not used by the logger
78+
logger.remove_appender(@custom_appender)
79+
deprecated_logger.remove_appender(@custom_appender)
5680
end
5781

5882
shared_examples '#validate_value success' do
@@ -78,8 +102,7 @@ def log_spy
78102
it 'does not emit a deprecation warning' do
79103
expect(LogStash::Settings.deprecation_logger).to_not receive(:deprecated).with(a_string_including(deprecated_setting_name))
80104
settings.get_setting(deprecated_setting_name).observe_post_process
81-
log_spy = retrieve_logger_spy(log_ctx)
82-
expect(log_spy.messages).to be_empty
105+
expect(events).to be_empty
83106
end
84107
end
85108
end
@@ -97,15 +120,15 @@ def log_spy
97120
end
98121

99122
it 'logs a deprecation warning' do
100-
expect(log_spy.messages[0]).to include(deprecated_setting_name)
123+
expect(events[0]).to include(deprecated_setting_name)
101124
end
102125

103126
include_examples '#validate_value success'
104127

105128
context "#observe_post_process" do
106129
it 're-emits the deprecation warning' do
107130
settings.get_setting(deprecated_setting_name).observe_post_process
108-
expect(log_spy.messages[0]).to include(deprecated_setting_name)
131+
expect(events[0]).to include(deprecated_setting_name)
109132
end
110133
end
111134

@@ -174,15 +197,15 @@ def log_spy
174197

175198
it 'does not produce a relevant deprecation warning' do
176199
settings.get_setting(deprecated_setting_name).observe_post_process
177-
expect(log_spy.messages).to be_empty
200+
expect(events).to be_empty
178201
end
179202

180203
include_examples '#validate_value success'
181204

182205
context "#observe_post_process" do
183206
it 'does not emit a deprecation warning' do
184207
settings.get_setting(deprecated_setting_name).observe_post_process
185-
expect(log_spy.messages).to be_empty
208+
expect(events).to be_empty
186209
end
187210
end
188211
end
@@ -204,7 +227,8 @@ def log_spy
204227
context 'Settings#get on deprecated alias' do
205228
it 'produces a WARN-level message to the logger' do
206229
settings.get(deprecated_setting_name)
207-
expect(log_spy.messages[0]).to include("setting `#{canonical_setting_name}` has been queried by its deprecated alias `#{deprecated_setting_name}`")
230+
sleep 0.1
231+
expect(events[0]).to include("setting `#{canonical_setting_name}` has been queried by its deprecated alias `#{deprecated_setting_name}`")
208232
end
209233
end
210234
end

0 commit comments

Comments
 (0)