00001 #include "logging/Category.hpp"
00002 #include <rtt/Logger.hpp>
00003 #include <log4cpp/NDC.hh>
00004 #include <log4cpp/HierarchyMaintainer.hh>
00005
00006 using namespace RTT;
00007
00008 namespace OCL {
00009 namespace logging {
00010
00011 Category::Category(const std::string& name,
00012 log4cpp::Category* parent,
00013 log4cpp::Priority::Value priority) :
00014 log4cpp::Category(name, parent, priority),
00015 log_port( convertName(name) )
00016 {
00017 }
00018
00019 Category::~Category()
00020 {
00021 }
00022
00023 void Category::log(log4cpp::Priority::Value priority,
00024 const RTT::rt_string& message) throw()
00025 {
00026 if (isPriorityEnabled(priority))
00027 {
00028 _logUnconditionally2(priority, message);
00029 }
00030 }
00031
00032 void Category::debug(const RTT::rt_string& message) throw()
00033 {
00034 if (isPriorityEnabled(log4cpp::Priority::DEBUG))
00035 _logUnconditionally2(log4cpp::Priority::DEBUG, message);
00036 }
00037
00038 void Category::info(const RTT::rt_string& message) throw()
00039 {
00040 if (isPriorityEnabled(log4cpp::Priority::INFO))
00041 _logUnconditionally2(log4cpp::Priority::INFO, message);
00042 }
00043
00044 void Category::notice(const RTT::rt_string& message) throw()
00045 {
00046 if (isPriorityEnabled(log4cpp::Priority::NOTICE))
00047 _logUnconditionally2(log4cpp::Priority::NOTICE, message);
00048 }
00049
00050 void Category::warn(const RTT::rt_string& message) throw()
00051 {
00052 if (isPriorityEnabled(log4cpp::Priority::WARN))
00053 _logUnconditionally2(log4cpp::Priority::WARN, message);
00054 }
00055
00056 void Category::error(const RTT::rt_string& message) throw()
00057 {
00058 if (isPriorityEnabled(log4cpp::Priority::ERROR))
00059 _logUnconditionally2(log4cpp::Priority::ERROR, message);
00060 }
00061
00062 void Category::crit(const RTT::rt_string& message) throw()
00063 {
00064 if (isPriorityEnabled(log4cpp::Priority::CRIT))
00065 _logUnconditionally2(log4cpp::Priority::CRIT, message);
00066 }
00067
00068 void Category::alert(const RTT::rt_string& message) throw()
00069 {
00070 if (isPriorityEnabled(log4cpp::Priority::ALERT))
00071 _logUnconditionally2(log4cpp::Priority::ALERT, message);
00072 }
00073
00074 void Category::emerg(const RTT::rt_string& message) throw()
00075 {
00076 if (isPriorityEnabled(log4cpp::Priority::EMERG))
00077 _logUnconditionally2(log4cpp::Priority::EMERG, message);
00078 }
00079
00080 void Category::fatal(const RTT::rt_string& message) throw()
00081 {
00082 if (isPriorityEnabled(log4cpp::Priority::FATAL))
00083 _logUnconditionally2(log4cpp::Priority::FATAL, message);
00084 }
00085
00086
00087 void Category::_logUnconditionally2(log4cpp::Priority::Value priority,
00088 const RTT::rt_string& message) throw()
00089 {
00090 try
00091 {
00092 OCL::logging::LoggingEvent event(RTT::rt_string(getName().c_str()),
00093 RTT::rt_string(message.c_str()),
00094
00095
00096 RTT::rt_string(""),
00097 priority);
00098 callAppenders(event);
00099 }
00100 catch (std::bad_alloc& e)
00101 {
00102
00103
00105 }
00106 }
00107
00108 void Category::callAppenders(const OCL::logging::LoggingEvent& event) throw()
00109 {
00110 log_port.write( event );
00111
00112
00113 if (getAdditivity() && (getParent() != NULL))
00114 {
00115 OCL::logging::Category* parent = dynamic_cast<OCL::logging::Category*>(getParent());
00116 if (parent)
00117 {
00118 parent->callAppenders(event);
00119 }
00120
00121 }
00122 }
00123
00124 std::string Category::convertName(const std::string& name)
00125 {
00126 std::string rc(name);
00127
00128 std::replace_if(rc.begin(),
00129 rc.end(),
00130 std::bind2nd(std::equal_to<char>(), '.'),
00131 '_');
00132
00133 return rc;
00134 }
00135
00136 log4cpp::Category* Category::createOCLCategory(const std::string& name,
00137 log4cpp::Category* parent,
00138 log4cpp::Priority::Value priority)
00139 {
00140
00141
00142
00143
00144 OCL::logging::Category* c = new OCL::logging::Category(name, parent, priority);
00145 return c;
00146 }
00147
00148 CategoryStream Category::getRTStream(log4cpp::Priority::Value priority)
00149 {
00150 return CategoryStream(this, isPriorityEnabled(priority) ?
00151 priority : log4cpp::Priority::NOTSET);
00152 }
00153
00154
00155 }
00156 }