Skip to content

Commit d4fd43b

Browse files
authored
logger: force_stacktrace_level was not applied to PluginLogger (#5038)
**Which issue(s) this PR fixes**: * Fixes a bug in #5008 **What this PR does / why we need it**: In #5008, we have added a new feature `force_stacktrace_level`. However, it was not applied to `PluginLogger`. So, depending on the settings and error locations, `force_stacktrace_level` could not work. This PR fixes it. **Docs Changes**: Not needed because #5008 is not released yet. **Release Note**: Not needed because #5008 is not released yet. **How to reproduce the bug**: conf: ```xml <system> <log> forced_stacktrace_level info </log> </system> <source> @type sample @id test tag test.fail </source> <match test.fail> @type null @id null never_flush <buffer> flush_mode interval flush_interval 1s </buffer> </match> ``` * Set `@id` to use `PluginLogger`. * Use `buffer` to use `PluginLogger`. * Without `buffer`, `RootAgent` outputs the logs for flushing errors by using the global logger. (`RootAgent#handle_emits_error`) log: ``` 2025-07-29 12:39:36 +0900 [info]: #0 fluentd worker is now running worker=0 2025-07-29 12:39:38 +0900 [warn]: #0 [null] failed to flush the buffer. retry_times=0 next_retry_time=2025-07-29 12:39:39 +0900 chunk="63b09284c334efa1927547b5623268ff" error_class=RuntimeError error="failed to flush" 2025-07-29 12:39:38 +0900 [warn]: #0 /home/daipom/work/fluentd/fluentd/lib/fluent/plugin/out_null.rb:59:in `write' 2025-07-29 12:39:38 +0900 [warn]: #0 /home/daipom/work/fluentd/fluentd/lib/fluent/plugin/output.rb:1212:in `try_flush' 2025-07-29 12:39:38 +0900 [warn]: #0 /home/daipom/work/fluentd/fluentd/lib/fluent/plugin/output.rb:1527:in `flush_thread_run' 2025-07-29 12:39:38 +0900 [warn]: #0 /home/daipom/work/fluentd/fluentd/lib/fluent/plugin/output.rb:490:in `block (2 levels) in start' 2025-07-29 12:39:38 +0900 [warn]: #0 /home/daipom/work/fluentd/fluentd/lib/fluent/plugin_helper/thread.rb:78:in `block in thread_create' ``` * The log levels of stacktraces are `warn`, although `forced_stacktrace_level` is `info`. Signed-off-by: Daijiro Fukuda <[email protected]>
1 parent 56ba858 commit d4fd43b

File tree

2 files changed

+86
-8
lines changed

2 files changed

+86
-8
lines changed

lib/fluent/log.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ def dup
174174
clone.format = @format
175175
clone.time_format = @time_format
176176
clone.log_event_enabled = @log_event_enabled
177+
clone.force_stacktrace_level(@forced_stacktrace_level)
177178
# optional headers/attrs are not copied, because new PluginLogger should have another one of it
178179
clone
179180
end
@@ -652,6 +653,9 @@ def initialize(logger)
652653
if logger.instance_variable_defined?(:@suppress_repeated_stacktrace)
653654
@suppress_repeated_stacktrace = logger.instance_variable_get(:@suppress_repeated_stacktrace)
654655
end
656+
if logger.instance_variable_defined?(:@forced_stacktrace_level)
657+
@forced_stacktrace_level = logger.instance_variable_get(:@forced_stacktrace_level)
658+
end
655659
if logger.instance_variable_defined?(:@ignore_repeated_log_interval)
656660
@ignore_repeated_log_interval = logger.instance_variable_get(:@ignore_repeated_log_interval)
657661
end

test/test_log.rb

Lines changed: 82 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -811,14 +811,6 @@ def test_initialize
811811
assert_equal(logger, @logger)
812812
end
813813

814-
def test_level
815-
log = Fluent::PluginLogger.new(@logger)
816-
assert_equal(log.level, @logger.level)
817-
log.level = "fatal"
818-
assert_equal(Fluent::Log::LEVEL_FATAL, log.level)
819-
assert_equal(Fluent::Log::LEVEL_TRACE, @logger.level)
820-
end
821-
822814
def test_enable_color
823815
log = Fluent::PluginLogger.new(@logger)
824816
log.enable_color(true)
@@ -864,6 +856,45 @@ def test_log_types
864856
@logger.fatal :worker0, "fatal log 6"
865857
end
866858

859+
sub_test_case "take over the parent logger" do
860+
def test_level
861+
log = Fluent::PluginLogger.new(@logger)
862+
assert_equal(log.level, @logger.level)
863+
log.level = "fatal"
864+
assert_equal(Fluent::Log::LEVEL_FATAL, log.level)
865+
assert_equal(Fluent::Log::LEVEL_TRACE, @logger.level)
866+
end
867+
868+
def test_options
869+
parent_log = Fluent::Log.new(
870+
ServerEngine::DaemonLogger.new(
871+
@log_device,
872+
log_level: ServerEngine::DaemonLogger::INFO,
873+
),
874+
suppress_repeated_stacktrace: true,
875+
ignore_repeated_log_interval: 10,
876+
ignore_same_log_interval: 10,
877+
)
878+
parent_log.force_stacktrace_level(Fluent::Log::LEVEL_INFO)
879+
880+
log = Fluent::PluginLogger.new(parent_log)
881+
assert_equal(
882+
[
883+
true,
884+
Fluent::Log::LEVEL_INFO,
885+
10,
886+
10,
887+
],
888+
[
889+
log.instance_variable_get(:@suppress_repeated_stacktrace),
890+
log.instance_variable_get(:@forced_stacktrace_level),
891+
log.instance_variable_get(:@ignore_repeated_log_interval),
892+
log.instance_variable_get(:@ignore_same_log_interval),
893+
]
894+
)
895+
end
896+
end
897+
867898
sub_test_case "supervisor process type" do
868899
setup do
869900
dl_opts = {}
@@ -1114,6 +1145,49 @@ def test_terminate
11141145
mock(plugin.log).reset
11151146
plugin.terminate
11161147
end
1148+
1149+
sub_test_case "take over the parent logger" do
1150+
def setup
1151+
super
1152+
1153+
begin
1154+
saved_global_logger = $log
1155+
$log = Fluent::Log.new(
1156+
ServerEngine::DaemonLogger.new(
1157+
Fluent::Test::DummyLogDevice.new,
1158+
log_level: ServerEngine::DaemonLogger::INFO,
1159+
),
1160+
suppress_repeated_stacktrace: true,
1161+
ignore_repeated_log_interval: 10,
1162+
ignore_same_log_interval: 10,
1163+
)
1164+
$log.force_stacktrace_level(Fluent::Log::LEVEL_INFO)
1165+
yield
1166+
ensure
1167+
$log = saved_global_logger
1168+
end
1169+
end
1170+
1171+
def test_options
1172+
plugin = DummyPlugin.new
1173+
plugin.configure(Fluent::Config::Element.new("input", "", {"@id" => "foo"}, []))
1174+
1175+
assert_equal(
1176+
[
1177+
true,
1178+
Fluent::Log::LEVEL_INFO,
1179+
10,
1180+
10,
1181+
],
1182+
[
1183+
plugin.log.instance_variable_get(:@suppress_repeated_stacktrace),
1184+
plugin.log.instance_variable_get(:@forced_stacktrace_level),
1185+
plugin.log.instance_variable_get(:@ignore_repeated_log_interval),
1186+
plugin.log.instance_variable_get(:@ignore_same_log_interval),
1187+
]
1188+
)
1189+
end
1190+
end
11171191
end
11181192

11191193
class LogDeviceIOTest < Test::Unit::TestCase

0 commit comments

Comments
 (0)