Skip to content

Commit ad92de5

Browse files
fujitatomoyaBarry-Xu-2018
authored andcommitted
add Logger::get_effective_level(). (ros2#2141)
Signed-off-by: Tomoya Fujita <[email protected]>
1 parent 0fe7cf7 commit ad92de5

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

rclcpp/include/rclcpp/logger.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ class Logger
170170
RCLCPP_PUBLIC
171171
void
172172
set_level(Level level);
173+
174+
/// Get effective level for current logger.
175+
/**
176+
* The effective level is determined as the severity level of
177+
* the logger if it is set, otherwise it is the first specified severity
178+
* level of the logger's ancestors, starting with its closest ancestor.
179+
* The ancestor hierarchy is signified by logger names being separated by dots:
180+
* a logger named `x` is an ancestor of `x.y`, and both `x` and `x.y` are
181+
* ancestors of `x.y.z`, etc.
182+
* If the level has not been set for the logger nor any of its
183+
* ancestors, the default level is used.
184+
*
185+
* \throws rclcpp::exceptions::RCLError if any error happens.
186+
* \return Level for the current logger.
187+
*/
188+
RCLCPP_PUBLIC
189+
Level
190+
get_effective_level() const;
173191
};
174192

175193
} // namespace rclcpp

rclcpp/src/rclcpp/logger.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,18 @@ Logger::set_level(Level level)
125125
}
126126
}
127127

128+
Logger::Level
129+
Logger::get_effective_level() const
130+
{
131+
int logger_level = rcutils_logging_get_logger_effective_level(get_name());
132+
133+
if (logger_level < 0) {
134+
exceptions::throw_from_rcl_error(
135+
RCL_RET_ERROR, "Couldn't get logger level",
136+
rcutils_get_error_state(), rcutils_reset_error);
137+
}
138+
139+
return static_cast<Level>(logger_level);
140+
}
141+
128142
} // namespace rclcpp

rclcpp/test/rclcpp/test_logger.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,50 @@ TEST(TestLogger, set_level) {
160160
EXPECT_EQ(RCUTILS_RET_OK, rcutils_logging_shutdown());
161161
}
162162

163+
TEST(TestLogger, get_effective_level) {
164+
ASSERT_EQ(RCUTILS_RET_OK, rcutils_logging_initialize());
165+
166+
rclcpp::Logger logger = rclcpp::get_logger("test_logger");
167+
rclcpp::Logger child_logger = rclcpp::get_logger("test_logger.child");
168+
169+
// set child logger level unset to test effective level
170+
child_logger.set_level(rclcpp::Logger::Level::Unset);
171+
172+
// default
173+
EXPECT_EQ(rclcpp::Logger::Level::Info, logger.get_effective_level());
174+
EXPECT_EQ(rclcpp::Logger::Level::Info, child_logger.get_effective_level());
175+
176+
// unset
177+
logger.set_level(rclcpp::Logger::Level::Unset);
178+
EXPECT_EQ(rclcpp::Logger::Level::Info, logger.get_effective_level());
179+
EXPECT_EQ(rclcpp::Logger::Level::Info, child_logger.get_effective_level());
180+
181+
// debug
182+
logger.set_level(rclcpp::Logger::Level::Debug);
183+
EXPECT_EQ(rclcpp::Logger::Level::Debug, logger.get_effective_level());
184+
EXPECT_EQ(rclcpp::Logger::Level::Debug, child_logger.get_effective_level());
185+
186+
// info
187+
logger.set_level(rclcpp::Logger::Level::Info);
188+
EXPECT_EQ(rclcpp::Logger::Level::Info, logger.get_effective_level());
189+
EXPECT_EQ(rclcpp::Logger::Level::Info, child_logger.get_effective_level());
190+
191+
// warn
192+
logger.set_level(rclcpp::Logger::Level::Warn);
193+
EXPECT_EQ(rclcpp::Logger::Level::Warn, logger.get_effective_level());
194+
EXPECT_EQ(rclcpp::Logger::Level::Warn, child_logger.get_effective_level());
195+
196+
// error
197+
logger.set_level(rclcpp::Logger::Level::Error);
198+
EXPECT_EQ(rclcpp::Logger::Level::Error, logger.get_effective_level());
199+
EXPECT_EQ(rclcpp::Logger::Level::Error, child_logger.get_effective_level());
200+
201+
// fatal
202+
logger.set_level(rclcpp::Logger::Level::Fatal);
203+
EXPECT_EQ(rclcpp::Logger::Level::Fatal, logger.get_effective_level());
204+
EXPECT_EQ(rclcpp::Logger::Level::Fatal, child_logger.get_effective_level());
205+
}
206+
163207
TEST(TestLogger, get_logging_directory) {
164208
ASSERT_EQ(true, rcutils_set_env("HOME", "/fake_home_dir"));
165209
ASSERT_EQ(true, rcutils_set_env("USERPROFILE", nullptr));

0 commit comments

Comments
 (0)