00001
00026 #include <Logger.H>
00027 #include <WURDEConfiguration.H>
00028
00029
00030 using namespace WURDE;
00031 using namespace std;
00032
00033 namespace WURDE{
00034
00035 Logger *g_robotLoggerPtr;
00036
00037 LoggerStream g_logdebug(LOG_DEBUG);
00038 LoggerStream g_loginfo(LOG_INFO);
00039 LoggerStream g_lognotice(LOG_NOTICE);
00040 LoggerStream g_logwarn(LOG_WARNING);
00041 LoggerStream g_logerror(LOG_ERR);
00042 LoggerStream g_logfatal(LOG_CRIT);
00043
00044
00045 Logger::Logger(std::string somename)
00046 :LoggerTransport("Any"){
00047 m_logName=somename;
00048 setGlobalName(somename);
00049 if(!g_robotLoggerPtr){
00050 g_robotLoggerPtr=this;
00051
00052 }
00053
00054
00055 m_toFile=false;
00056 m_toNetwork=false;
00057 m_toSyslog=false;
00058 m_toStderr=false;
00059
00060 m_logLevel=LOG_DEBUG;
00061
00062 setNetworkLogging(true);
00063 setStderr(true);
00064 setSysLogging(true);
00065 m_init=false;
00066 };
00067
00068 Logger::Logger(std::string somename, std::string filename)
00069 :LoggerTransport("Any"){
00070 m_logName=somename;
00071 setGlobalName(somename);
00072 if(!g_robotLoggerPtr){
00073 g_robotLoggerPtr=this;
00074
00075 }
00076
00077
00078 m_toFile=false;
00079 m_toNetwork=false;
00080 m_toSyslog=false;
00081 m_toStderr=false;
00082
00083
00084 m_outFilename=filename;
00085 m_init=false;
00086 setNetworkLogging(true);
00087 setStderr(true);
00088 setSysLogging(true);
00089 }
00090
00091 void Logger::initLogger(){
00092 mutex= (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
00093 m_init=true;
00094 m_logLevel=g_globalConfiguration.getLogLevel();
00095 }
00096
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 void Logger::log(std::string somestring, int priority){
00110 if(!m_init){
00111 initLogger();
00112 }
00113
00114 std::string logstring;
00115 logstring = m_logName + " " + priorityToString(priority) +" " + somestring;
00116
00117 if(priority <= m_logLevel){
00118 if(m_toSyslog){
00119 syslog(priority|LOG_LOCAL0,logstring.c_str());
00120 }
00121
00122 if(m_toFile){
00123
00124
00125 }
00126
00127 if(m_toNetwork){
00128 pthread_mutex_lock(&mutex);
00129 data.logFormat="";
00130 data.logData.push_back(0);
00131 data.logString=somestring.c_str();
00132 data.priority=priority;
00133
00134 publishData();
00135 runUpdate();
00136 pthread_mutex_unlock(&mutex);
00137 }
00138 }
00139 }
00140
00141
00142 void Logger::setNetworkLogging(bool value){
00143 if(value&&!m_toNetwork){
00144 data.timestamp.now();
00145 data.source=m_globalname;
00146 data.logData.push_back(0);
00147
00148 data.logFormat= " ";
00149 data.logString= " ";
00150 }
00151 m_toNetwork=false;
00152
00153 }
00154
00155 void Logger::setSysLogging(bool value){
00156 if(value&&!m_toSyslog){
00157 if(m_toStderr){
00158 openlog("Robot",LOG_PERROR|LOG_PID,LOG_LOCAL0);
00159 }else{
00160 openlog("Robot",LOG_PID,LOG_LOCAL0);
00161 }
00162 }else if(!value&&m_toSyslog){
00163 closelog();
00164 }
00165
00166 m_toSyslog=value;
00167
00168 }
00169
00170 void Logger::setStderr(bool value){
00171 if(value){
00172 if(m_toSyslog&&!m_toStderr){
00173 closelog();
00174 openlog("Robot",LOG_PERROR|LOG_PID,LOG_LOCAL0);
00175 }
00176 }else{
00177 if(m_toSyslog&&m_toStderr){
00178 closelog();
00179 openlog("Robot",LOG_PID,LOG_LOCAL0);
00180 }
00181 }
00182
00183 m_toStderr=value;
00184 }
00185
00186 const char * priorityToString( int priority ){
00187
00188 switch(priority){
00189 case LOG_EMERG:
00190 return "[Emergency]";
00191 case LOG_ALERT:
00192 return "[Alert]";
00193 case LOG_CRIT:
00194 return "[Fatal]";
00195 case LOG_ERR:
00196 return "[Error]";
00197 case LOG_WARNING:
00198 return "[Warn]";
00199 case LOG_NOTICE:
00200 return "[Notice]";
00201 case LOG_INFO:
00202 return "[Info]";
00203 case LOG_DEBUG:
00204 return "[Debug]";
00205 default:
00206 break;
00207 }
00208
00209 return "[Unknown]";
00210
00211 }
00212
00213
00214
00215 }