Skip to content

Commit

Permalink
Merge pull request #306 from ros/log4cxx
Browse files Browse the repository at this point in the history
refactoring to make log4cxx an optional dependency
  • Loading branch information
dirk-thomas committed Nov 18, 2013
2 parents 8de9495 + a2eba21 commit 5585842
Show file tree
Hide file tree
Showing 18 changed files with 1,069 additions and 510 deletions.
13 changes: 0 additions & 13 deletions clients/roscpp/include/ros/file_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,6 @@
#include <ros/console.h>
#include "common.h"

namespace log4cxx
{
namespace helpers
{
template <class T> class ObjectPtrT;
}

class Logger;
typedef helpers::ObjectPtrT<Logger> LoggerPtr;
class Level;
typedef helpers::ObjectPtrT<Level> LevelPtr;
}

#define ROSCPP_LOG_DEBUG(...) ROS_DEBUG_NAMED("roscpp_internal", __VA_ARGS__)

namespace ros
Expand Down
16 changes: 4 additions & 12 deletions clients/roscpp/include/ros/rosout_appender.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@
#include <ros/message_forward.h>
#include "common.h"

#include "log4cxx/appenderskeleton.h"

#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

Expand All @@ -57,20 +55,17 @@ class Publication;
typedef boost::shared_ptr<Publication> PublicationPtr;
typedef boost::weak_ptr<Publication> PublicationWPtr;

class ROSCPP_DECL ROSOutAppender : public log4cxx::AppenderSkeleton
class ROSCPP_DECL ROSOutAppender : public ros::console::LogAppender
{
public:
ROSOutAppender();
~ROSOutAppender();

const std::string& getLastError();

protected:
virtual void append(const log4cxx::spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool);
const std::string& getLastError() const;

virtual void close() {}
virtual bool requiresLayout() const { return false; }
virtual void log(::ros::console::Level level, const char* str, const char* file, const char* function, int line);

protected:
void logThread();

std::string last_error_;
Expand All @@ -84,9 +79,6 @@ class ROSCPP_DECL ROSOutAppender : public log4cxx::AppenderSkeleton
boost::thread publish_thread_;
};

//LOG4CXX_PTR_DEF(ROSOutAppender);
typedef log4cxx::helpers::ObjectPtrT<ROSOutAppender> ROSOutAppenderPtr;

} // namespace ros

#endif
3 changes: 0 additions & 3 deletions clients/roscpp/src/libros/file_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@
#include "ros/file_log.h"
#include "ros/this_node.h"

#include "log4cxx/rollingfileappender.h"
#include "log4cxx/patternlayout.h"
#include <ros/io.h>
#include <ros/console.h>

Expand All @@ -53,7 +51,6 @@ namespace file_log
{

std::string g_log_directory;
log4cxx::LoggerPtr g_file_only_logger;

const std::string& getLogDirectory()
{
Expand Down
96 changes: 44 additions & 52 deletions clients/roscpp/src/libros/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,6 @@

#include <cstdlib>

#ifdef _MSC_VER
#include "log4cxx/helpers/transcoder.h" // Have to be able to encode wchar LogStrings on windows.
#endif

namespace ros
{

Expand Down Expand Up @@ -97,7 +93,7 @@ void init(const M_string& remappings);
}

CallbackQueuePtr g_global_queue;
ROSOutAppenderPtr g_rosout_appender;
ROSOutAppender* g_rosout_appender;
static CallbackQueuePtr g_internal_callback_queue;

static bool g_initialized = false;
Expand Down Expand Up @@ -174,72 +170,78 @@ void shutdownCallback(XmlRpc::XmlRpcValue& params, XmlRpc::XmlRpcValue& result)

bool getLoggers(roscpp::GetLoggers::Request&, roscpp::GetLoggers::Response& resp)
{
log4cxx::spi::LoggerRepositoryPtr repo = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME)->getLoggerRepository();

log4cxx::LoggerList loggers = repo->getCurrentLoggers();
log4cxx::LoggerList::iterator it = loggers.begin();
log4cxx::LoggerList::iterator end = loggers.end();
for (; it != end; ++it)
std::map<std::string, ros::console::levels::Level> loggers;
bool success = ::ros::console::get_loggers(loggers);
if (success)
{
roscpp::Logger logger;
#ifdef _MSC_VER
LOG4CXX_ENCODE_CHAR(tmp_name_str, (*it)->getName()); // has to handle LogString with wchar types.
logger.name = tmp_name_str; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
#else
logger.name = (*it)->getName();
#endif
const log4cxx::LevelPtr& level = (*it)->getEffectiveLevel();
if (level)
for (std::map<std::string, ros::console::levels::Level>::const_iterator it = loggers.begin(); it != loggers.end(); it++)
{
#ifdef _MSC_VER
LOG4CXX_ENCODE_CHAR(tmp_level_str, level->toString()); // has to handle LogString with wchar types.
logger.level = tmp_level_str; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
#else
logger.level = level->toString();
#endif
roscpp::Logger logger;
logger.name = it->first;
ros::console::levels::Level level = it->second;
if (level == ros::console::levels::Debug)
{
logger.level = "debug";
}
else if (level == ros::console::levels::Info)
{
logger.level = "info";
}
else if (level == ros::console::levels::Warn)
{
logger.level = "warn";
}
else if (level == ros::console::levels::Error)
{
logger.level = "error";
}
else if (level == ros::console::levels::Fatal)
{
logger.level = "fatal";
}
resp.loggers.push_back(logger);
}
resp.loggers.push_back(logger);
}

return true;
return success;
}

bool setLoggerLevel(roscpp::SetLoggerLevel::Request& req, roscpp::SetLoggerLevel::Response&)
{
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(req.logger);
log4cxx::LevelPtr level;

std::transform(req.level.begin(), req.level.end(), req.level.begin(), (int(*)(int))std::toupper);

ros::console::levels::Level level;
if (req.level == "DEBUG")
{
level = log4cxx::Level::getDebug();
level = ros::console::levels::Debug;
}
else if (req.level == "INFO")
{
level = log4cxx::Level::getInfo();
level = ros::console::levels::Info;
}
else if (req.level == "WARN")
{
level = log4cxx::Level::getWarn();
level = ros::console::levels::Warn;
}
else if (req.level == "ERROR")
{
level = log4cxx::Level::getError();
level = ros::console::levels::Error;
}
else if (req.level == "FATAL")
{
level = log4cxx::Level::getFatal();
level = ros::console::levels::Fatal;
}
else
{
return false;
}

if (level)
bool success = ::ros::console::set_logger_level(req.logger, level);
if (success)
{
logger->setLevel(level);
console::notifyLoggerLevelsChanged();
return true;
}

return false;
return success;
}

bool closeAllConnections(roscpp::Empty::Request&, roscpp::Empty::Response&)
Expand Down Expand Up @@ -353,8 +355,7 @@ void start()
if (!(g_init_options & init_options::NoRosout))
{
g_rosout_appender = new ROSOutAppender;
const log4cxx::LoggerPtr& logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
logger->addAppender(g_rosout_appender);
ros::console::register_appender(g_rosout_appender);
}

if (g_shutting_down) goto end;
Expand Down Expand Up @@ -573,17 +574,8 @@ void shutdown()
g_internal_queue_thread.join();
}

const log4cxx::LoggerPtr& logger = log4cxx::Logger::getLogger(ROSCONSOLE_ROOT_LOGGER_NAME);
logger->removeAppender(g_rosout_appender);
g_rosout_appender = 0;

// reset this so that the logger doesn't get crashily destroyed
// again during global destruction.
//
// See https://code.ros.org/trac/ros/ticket/3271
//
log4cxx::Logger::getRootLogger()->getLoggerRepository()->shutdown();

if (g_started)
{
TopicManager::instance()->shutdown();
Expand Down
70 changes: 20 additions & 50 deletions clients/roscpp/src/libros/rosout_appender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,6 @@
#include "ros/advertise_options.h"
#include "ros/names.h"

#include <log4cxx/spi/loggingevent.h>
#ifdef _MSC_VER
#include "log4cxx/helpers/transcoder.h" // Have to be able to encode wchar LogStrings on windows.
#endif

#ifdef WIN32
#ifdef ERROR
// ach, windows.h polluting everything again,
// clashes with autogenerated rosgraph_msgs/Log.h
#undef ERROR
#endif
#endif
#include <rosgraph_msgs/Log.h>

namespace ros
Expand Down Expand Up @@ -79,66 +67,48 @@ ROSOutAppender::~ROSOutAppender()
publish_thread_.join();
}

const std::string& ROSOutAppender::getLastError()
const std::string& ROSOutAppender::getLastError() const
{
return last_error_;
}

void ROSOutAppender::append(const log4cxx::spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool)
void ROSOutAppender::log(::ros::console::Level level, const char* str, const char* file, const char* function, int line)
{
rosgraph_msgs::LogPtr msg(new rosgraph_msgs::Log);

msg->header.stamp = ros::Time::now();

if (event->getLevel() == log4cxx::Level::getFatal())
if (level == ros::console::levels::Debug)
{
msg->level = rosgraph_msgs::Log::FATAL;
#ifdef _MSC_VER
LOG4CXX_ENCODE_CHAR(tmpstr, event->getMessage()); // has to handle LogString with wchar types.
last_error_ = tmpstr; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
#else
last_error_ = event->getMessage();
#endif

msg->level = rosgraph_msgs::Log::DEBUG;
}
else if (event->getLevel() == log4cxx::Level::getError())
else if (level == ros::console::levels::Info)
{
msg->level = rosgraph_msgs::Log::ERROR;
#ifdef _MSC_VER
LOG4CXX_ENCODE_CHAR(tmpstr, event->getMessage()); // has to handle LogString with wchar types.
last_error_ = tmpstr; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
#else
last_error_ = event->getMessage();
#endif
msg->level = rosgraph_msgs::Log::INFO;
}
else if (event->getLevel() == log4cxx::Level::getWarn())
else if (level == ros::console::levels::Warn)
{
msg->level = rosgraph_msgs::Log::WARN;
}
else if (event->getLevel() == log4cxx::Level::getInfo())
else if (level == ros::console::levels::Error)
{
msg->level = rosgraph_msgs::Log::INFO;
msg->level = rosgraph_msgs::Log::ERROR;
}
else if (event->getLevel() == log4cxx::Level::getDebug())
else if (level == ros::console::levels::Fatal)
{
msg->level = rosgraph_msgs::Log::DEBUG;
msg->level = rosgraph_msgs::Log::FATAL;
}

msg->name = this_node::getName();
#ifdef _MSC_VER
LOG4CXX_ENCODE_CHAR(tmpstr, event->getMessage()); // has to handle LogString with wchar types.
msg->msg = tmpstr; // tmpstr gets instantiated inside the LOG4CXX_ENCODE_CHAR macro
#else
msg->msg = event->getMessage();
#endif

const log4cxx::spi::LocationInfo& info = event->getLocationInformation();
msg->file = info.getFileName();
msg->function = info.getMethodName();
msg->line = info.getLineNumber();

msg->msg = str;
msg->file = file;
msg->function = function;
msg->line = line;
this_node::getAdvertisedTopics(msg->topics);

if (level == ::ros::console::levels::Fatal || level == ::ros::console::levels::Error)
{
last_error_ = str;
}

boost::mutex::scoped_lock lock(queue_mutex_);
log_queue_.push_back(msg);
queue_condition_.notify_all();
Expand Down
18 changes: 3 additions & 15 deletions clients/roscpp/src/libros/topic_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1002,7 +1002,7 @@ void TopicManager::getPublications(XmlRpcValue &pubs)
}
}

extern ROSOutAppenderPtr g_rosout_appender;
extern std::string console::g_last_error_message;

void TopicManager::pubUpdateCallback(XmlRpc::XmlRpcValue& params, XmlRpc::XmlRpcValue& result)
{
Expand All @@ -1017,27 +1017,15 @@ void TopicManager::pubUpdateCallback(XmlRpc::XmlRpcValue& params, XmlRpc::XmlRpc
}
else
{
std::string last_error = "Unknown Error";
if ( g_rosout_appender != 0 )
{
last_error = g_rosout_appender->getLastError();
}

result = xmlrpc::responseInt(0, last_error, 0);
result = xmlrpc::responseInt(0, console::g_last_error_message, 0);
}
}

void TopicManager::requestTopicCallback(XmlRpc::XmlRpcValue& params, XmlRpc::XmlRpcValue& result)
{
if (!requestTopic(params[1], params[2], result))
{
std::string last_error = "Unknown Error";
if ( g_rosout_appender != 0 )
{
last_error = g_rosout_appender->getLastError();
}

result = xmlrpc::responseInt(0, last_error, 0);
result = xmlrpc::responseInt(0, console::g_last_error_message, 0);
}
}

Expand Down
Loading

0 comments on commit 5585842

Please sign in to comment.