Skip to content

Commit bb4ac89

Browse files
authored
fix(agent): apply the configured logger_level to the default logger (#376)
Fixes #371
1 parent 06eb0b4 commit bb4ac89

2 files changed

Lines changed: 73 additions & 2 deletions

File tree

packages/forest_admin_agent/lib/forest_admin_agent/services/logger_service.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ class LoggerService
99
'Info' => Logger::INFO,
1010
'Debug' => Logger::DEBUG,
1111
'Warn' => Logger::WARN,
12-
'Error' => Logger::ERROR
12+
'Error' => Logger::ERROR,
13+
'Fatal' => Logger::FATAL,
14+
'Unknown' => Logger::UNKNOWN
1315
}.freeze
1416

1517
def initialize(logger_level = 'Info', logger = nil)
1618
@logger_level = logger_level
1719
@logger = logger
1820
@default_logger = MonoLogger.new($stdout)
21+
@default_logger.level = get_level(@logger_level) || Logger::INFO
1922
end
2023

2124
def log(level, message)
@@ -28,7 +31,7 @@ def log(level, message)
2831
end
2932

3033
def get_level(level)
31-
LEVELS[level]
34+
LEVELS[level.to_s.capitalize]
3235
end
3336
end
3437
end
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
require 'spec_helper'
2+
3+
module ForestAdminAgent
4+
module Services
5+
describe LoggerService do
6+
describe 'default logger level' do
7+
it 'defaults to Info' do
8+
service = described_class.new
9+
10+
expect(service.default_logger.level).to eq(Logger::INFO)
11+
end
12+
13+
it 'applies the configured level to the default logger' do
14+
service = described_class.new('Warn')
15+
16+
expect(service.default_logger.level).to eq(Logger::WARN)
17+
end
18+
19+
it 'is case-insensitive, so the config-style lowercase levels work too' do
20+
service = described_class.new('debug')
21+
22+
expect(service.default_logger.level).to eq(Logger::DEBUG)
23+
end
24+
25+
it 'falls back to Info when given an unknown level' do
26+
service = described_class.new('nonsense')
27+
28+
expect(service.default_logger.level).to eq(Logger::INFO)
29+
end
30+
31+
it 'supports Fatal, the quietest level' do
32+
service = described_class.new('Fatal')
33+
34+
expect(service.default_logger.level).to eq(Logger::FATAL)
35+
end
36+
37+
it 'supports Unknown' do
38+
service = described_class.new('Unknown')
39+
40+
expect(service.default_logger.level).to eq(Logger::UNKNOWN)
41+
end
42+
end
43+
44+
describe '#log' do
45+
it 'filters out messages below the configured level on the default logger' do
46+
# MonoLogger captures the $stdout object at construction time, so the service
47+
# has to be built inside the block for RSpec's stdout swap to reach its writes.
48+
expect do
49+
described_class.new('Warn').log('Info', 'hidden')
50+
end.not_to output(/hidden/).to_stdout
51+
end
52+
53+
it 'still emits messages at or above the configured level' do
54+
expect do
55+
described_class.new('Warn').log('Warn', 'shown')
56+
end.to output(/shown/).to_stdout
57+
end
58+
59+
it 'delegates to a custom logger regardless of logger_level' do
60+
custom_logger = 'proc { |severity, message| $stdout.puts "custom:#{severity}:#{message}" }' # rubocop:disable Lint/InterpolationCheck
61+
service = described_class.new('Error', custom_logger)
62+
63+
expect { service.log('Info', 'hello') }.to output(/custom:1:hello/).to_stdout
64+
end
65+
end
66+
end
67+
end
68+
end

0 commit comments

Comments
 (0)