converters/log.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2015 Aldebaran
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 
18 #include "log.hpp"
19 
20 #include <qicore/logmessage.hpp>
21 #include <queue>
22 
23 #include <std_msgs/String.h>
24 
25 #include <boost/algorithm/string.hpp>
26 #include <boost/thread/mutex.hpp>
27 #include <boost/foreach.hpp>
28 
29 #include <ros/console.h>
30 
31 #define for_each BOOST_FOREACH
32 
33 namespace naoqi
34 {
35 namespace converter
36 {
37 
39 boost::mutex MUTEX_LOGS;
41 std::queue<rosgraph_msgs::Log> LOGS;
43 class LogLevel
44 {
45 public:
46  LogLevel(qi::LogLevel qi, rosgraph_msgs::Log::_level_type ros_msg, ros::console::levels::Level ros_console) :
47  qi_(qi), ros_msg_(ros_msg), ros_console_(ros_console)
48  {
49  all_.push_back(*this);
50  }
51 
52  static const LogLevel& get_from_qi(qi::LogLevel qi)
53  {
54  for_each(const LogLevel& log_level, all_)
55  if (log_level.qi_ == qi)
56  return log_level;
57  return LogLevel::default_;
58  }
59 
60  static const LogLevel& get_from_ros_msg(rosgraph_msgs::Log::_level_type ros_msg)
61  {
62  for_each(const LogLevel& log_level, all_)
63  if (log_level.ros_msg_ == ros_msg)
64  return log_level;
65  return LogLevel::default_;
66  }
67 
69  {
70  for_each(const LogLevel& log_level, all_)
71  if (log_level.ros_console_ == ros_console)
72  return log_level;
73  return LogLevel::default_;
74  }
75 
76  qi::LogLevel qi_;
77  rosgraph_msgs::Log::_level_type ros_msg_;
79 
80  static const LogLevel default_;
81 
82 private:
83  static std::vector<LogLevel> all_;
84 };
85 
86 std::vector<LogLevel> LogLevel::all_ = std::vector<LogLevel>();
87 const LogLevel LogLevel::default_ = LogLevel(qi::LogLevel_Info, rosgraph_msgs::Log::INFO, ros::console::levels::Info);
88 
91 void logCallback(const qi::LogMessage& msg)
92 {
93  // Convert the NAOqi log to a ROS log
94  rosgraph_msgs::Log log;
95 
96  std::vector<std::string> results;
97  boost::split(results, msg.source, boost::is_any_of(":"));
98  log.file = results[0];
99  log.function = results[1];
100  log.line = atoi(results[2].c_str());
101  log.level = LogLevel::get_from_qi(msg.level).ros_msg_;
102  log.name = msg.category;
103  log.msg = msg.message;
104  log.header.stamp = ros::Time(msg.timestamp.tv_sec, msg.timestamp.tv_usec);
105 
106  // If we are not publishing, the queue will increase, so we have to prevent an explosion
107  // We only keep a log if it's within 5 second of the last publish (totally arbitrary)
108  boost::mutex::scoped_lock lock( MUTEX_LOGS );
109  while (LOGS.size() > 1000)
110  {
111  LOGS.pop();
112  }
113  LOGS.push(log);
114 }
115 
116 LogConverter::LogConverter( const std::string& name, float frequency, const qi::SessionPtr& session )
117  : BaseConverter( name, frequency, session ),
118  logger_( session->service("LogManager") ),
119  // Default log level is info
120  log_level_(qi::LogLevel_Info)
121 {
122  // Define the log equivalents
124  LogLevel(qi::LogLevel_Fatal, rosgraph_msgs::Log::FATAL, ros::console::levels::Fatal);
125  LogLevel(qi::LogLevel_Error, rosgraph_msgs::Log::ERROR, ros::console::levels::Error);
126  LogLevel(qi::LogLevel_Warning, rosgraph_msgs::Log::WARN, ros::console::levels::Warn);
127  LogLevel(qi::LogLevel_Info, rosgraph_msgs::Log::INFO, ros::console::levels::Info);
130 
131  listener_ = logger_->getListener();
133  listener_->onLogMessage.connect(logCallback);
134 }
135 
137 {
138  callbacks_[action] = cb;
139 }
140 
141 void LogConverter::callAll( const std::vector<message_actions::MessageAction>& actions )
142 {
143  while ( !LOGS.empty() )
144  {
145  rosgraph_msgs::Log& log_msg = LOGS.front();
146  for_each( const message_actions::MessageAction& action, actions)
147  {
148  callbacks_[action](log_msg);
149  }
150  {
151  boost::mutex::scoped_lock lock( MUTEX_LOGS );
152  LOGS.pop();
153  }
154  }
156 }
157 
159 {
160 }
161 
163 {
164  // Check that the log level is above or equal to the current one
165  std::map<std::string, ros::console::levels::Level> loggers;
166  ros::console::get_loggers(loggers);
167 
168  std::map<std::string, ros::console::levels::Level>::iterator iter = loggers.find("ros.naoqi_driver");
169 
170  if (iter == loggers.end())
171  return;
172 
173  qi::LogLevel new_level = LogLevel::get_from_ros_console(iter->second).qi_;
174  // Only change the log level if it has changed (otherwise, there is a flood of warnings)
175  if (new_level == log_level_)
176  return;
177 
178  log_level_ = new_level;
179  qi::log::setLogLevel(log_level_);
180 }
181 
182 } // publisher
183 } //naoqi
ros::console::levels::Error
Error
msg
msg
naoqi::converter::LogLevel::all_
static std::vector< LogLevel > all_
Definition: converters/log.cpp:83
naoqi::converter::LogConverter::log_level_
qi::LogLevel log_level_
Definition: converters/log.hpp:54
naoqi::converter::logCallback
void logCallback(const qi::LogMessage &msg)
Definition: converters/log.cpp:91
DEBUG
#define DEBUG
Definition: naoqi_driver.cpp:113
converter
qi::LogMessage
naoqi::converter::LogConverter::callbacks_
std::map< message_actions::MessageAction, Callback_t > callbacks_
Definition: converters/log.hpp:57
session
session
naoqi::message_actions::MessageAction
MessageAction
Definition: message_actions.h:9
naoqi::converter::LogLevel::get_from_qi
static const LogLevel & get_from_qi(qi::LogLevel qi)
Definition: converters/log.cpp:52
naoqi::converter::LogLevel::get_from_ros_console
static const LogLevel & get_from_ros_console(ros::console::levels::Level ros_console)
Definition: converters/log.cpp:68
log
log
naoqi::converter::LogLevel
Definition: converters/log.cpp:43
naoqi::converter::LogConverter::LogConverter
LogConverter(const std::string &name, float frequency, const qi::SessionPtr &sessions)
Definition: converters/log.cpp:116
logmessage.hpp
naoqi
Definition: converter.hpp:29
console.h
ros::console::levels::Debug
Debug
naoqi::converter::LogConverter::reset
void reset()
Definition: converters/log.cpp:158
naoqi::converter::LogLevel::ros_msg_
rosgraph_msgs::Log::_level_type ros_msg_
Definition: converters/log.cpp:77
naoqi::converter::LogConverter::callAll
void callAll(const std::vector< message_actions::MessageAction > &actions)
Definition: converters/log.cpp:141
naoqi::converter::LogLevel::LogLevel
LogLevel(qi::LogLevel qi, rosgraph_msgs::Log::_level_type ros_msg, ros::console::levels::Level ros_console)
Definition: converters/log.cpp:46
naoqi::converter::LogConverter::set_qi_logger_level
void set_qi_logger_level()
Definition: converters/log.cpp:162
naoqi::converter::LOGS
std::queue< rosgraph_msgs::Log > LOGS
Definition: converters/log.cpp:41
name
name
naoqi::converter::LogLevel::qi_
qi::LogLevel qi_
Definition: converters/log.cpp:76
ros::console::levels::Level
Level
ros::console::levels::Info
Info
log.hpp
naoqi::converter::BaseConverter
Definition: converter_base.hpp:40
qi
naoqi::converter::LogConverter::listener_
qi::LogListenerPtr listener_
Definition: converters/log.hpp:55
for_each
#define for_each
Definition: converters/log.cpp:31
naoqi::converter::LogLevel::default_
static const LogLevel default_
Definition: converters/log.cpp:80
ros::console::levels::Fatal
Fatal
ros::Time
naoqi::converter::LogConverter::Callback_t
boost::function< void(rosgraph_msgs::Log &) > Callback_t
Definition: converters/log.hpp:37
naoqi::converter::MUTEX_LOGS
boost::mutex MUTEX_LOGS
Definition: converters/log.cpp:39
ros::console::levels::Warn
Warn
naoqi::converter::LogConverter::logger_
qi::LogManagerPtr logger_
Definition: converters/log.hpp:52
ros::console::get_loggers
ROSCONSOLE_DECL bool get_loggers(std::map< std::string, levels::Level > &loggers)
naoqi::converter::LogConverter::registerCallback
void registerCallback(const message_actions::MessageAction action, Callback_t cb)
Definition: converters/log.cpp:136
naoqi::converter::LogLevel::get_from_ros_msg
static const LogLevel & get_from_ros_msg(rosgraph_msgs::Log::_level_type ros_msg)
Definition: converters/log.cpp:60
naoqi::converter::LogLevel::ros_console_
ros::console::levels::Level ros_console_
Definition: converters/log.cpp:78


naoqi_driver
Author(s): Karsten Knese
autogenerated on Sat Feb 3 2024 03:50:06