|
44 | 44 | #include <logging_demo/srv/config_logger.hpp> |
45 | 45 | #include <rclcpp/rclcpp.hpp> |
46 | 46 |
|
| 47 | +#include <rcutils/logging.h> |
| 48 | + |
| 49 | +#include <functional> |
| 50 | +#include <string> |
| 51 | +#include <utility> |
| 52 | + |
47 | 53 | namespace autoware_utils_logging |
48 | 54 | { |
49 | 55 |
|
50 | | -class LoggerLevelConfigure |
| 56 | +template <typename NodeT = rclcpp::Node> |
| 57 | +class BasicLoggerLevelConfigure |
51 | 58 | { |
52 | 59 | private: |
53 | 60 | using ConfigLogger = logging_demo::srv::ConfigLogger; |
| 61 | + using CallbackT = std::function<void( |
| 62 | + ConfigLogger::Request::SharedPtr, ConfigLogger::Response::SharedPtr)>; |
| 63 | + using ServicePtr = decltype(std::declval<NodeT *>()->template create_service<ConfigLogger>( |
| 64 | + std::declval<std::string>(), std::declval<CallbackT>())); |
54 | 65 |
|
55 | 66 | public: |
56 | | - explicit LoggerLevelConfigure(rclcpp::Node * node); |
| 67 | + explicit BasicLoggerLevelConfigure(NodeT * node) : ros_logger_(node->get_logger()) |
| 68 | + { |
| 69 | + using std::placeholders::_1; |
| 70 | + using std::placeholders::_2; |
| 71 | + |
| 72 | + srv_config_logger_ = node->template create_service<ConfigLogger>( |
| 73 | + "~/config_logger", |
| 74 | + std::bind(&BasicLoggerLevelConfigure::on_logger_config_service, this, _1, _2)); |
| 75 | + } |
57 | 76 |
|
58 | 77 | private: |
59 | 78 | rclcpp::Logger ros_logger_; |
60 | | - rclcpp::Service<ConfigLogger>::SharedPtr srv_config_logger_; |
| 79 | + ServicePtr srv_config_logger_; |
61 | 80 |
|
62 | 81 | void on_logger_config_service( |
63 | 82 | const ConfigLogger::Request::SharedPtr request, |
64 | | - const ConfigLogger::Response::SharedPtr response); |
| 83 | + const ConfigLogger::Response::SharedPtr response) |
| 84 | + { |
| 85 | + int logging_severity; |
| 86 | + const auto ret_level = rcutils_logging_severity_level_from_string( |
| 87 | + request->level.c_str(), rcl_get_default_allocator(), &logging_severity); |
| 88 | + |
| 89 | + if (ret_level != RCUTILS_RET_OK) { |
| 90 | + response->success = false; |
| 91 | + RCLCPP_WARN_STREAM( |
| 92 | + ros_logger_, "Failed to change logger level for " |
| 93 | + << request->logger_name |
| 94 | + << " due to an invalid logging severity: " << request->level); |
| 95 | + return; |
| 96 | + } |
| 97 | + |
| 98 | + const auto ret_set = |
| 99 | + rcutils_logging_set_logger_level(request->logger_name.c_str(), logging_severity); |
| 100 | + |
| 101 | + if (ret_set != RCUTILS_RET_OK) { |
| 102 | + response->success = false; |
| 103 | + RCLCPP_WARN_STREAM(ros_logger_, "Failed to set logger level for " << request->logger_name); |
| 104 | + return; |
| 105 | + } |
| 106 | + |
| 107 | + response->success = true; |
| 108 | + RCLCPP_INFO_STREAM( |
| 109 | + ros_logger_, "Logger level [" << request->level << "] is set for " << request->logger_name); |
| 110 | + } |
65 | 111 | }; |
66 | 112 |
|
| 113 | +using LoggerLevelConfigure = BasicLoggerLevelConfigure<rclcpp::Node>; |
| 114 | + |
67 | 115 | } // namespace autoware_utils_logging |
68 | 116 |
|
69 | 117 | #endif // AUTOWARE_UTILS_LOGGING__LOGGER_LEVEL_CONFIGURE_HPP_ |
0 commit comments