|
Fluid Dynamics Library
|
00001 /* 00002 * Logger.cpp 00003 * ECSLogger 00004 * 00005 * Created by M. Hank Kiedrowski on 8/4/10. 00006 * Copyright 2010 Clockwork Active Media Systems. All rights reserved. 00007 * 00008 */ 00009 00010 00011 #include "logger/logger.h" 00012 #include "logger/logwriter.h" 00013 00014 #include <boost/date_time/gregorian/gregorian.hpp> 00015 #include <boost/date_time/posix_time/posix_time.hpp> 00016 #include <boost/date_time/local_time/local_time.hpp> 00017 #include <iostream> 00018 #include <locale> 00019 00020 namespace fdl { 00021 00022 int Logger::_level = Logger::DEFAULT_REPORTING_LEVEL; 00023 std::vector<int> Logger::_levelStack( 1, Logger::DEFAULT_REPORTING_LEVEL ); 00024 std::list<LogWriter *> Logger::_registeredWriters; 00025 std::string Logger::_identity = "fdlLogger"; 00026 00031 Logger::Logger() : 00032 m_local_identity( NULL ) { 00033 } 00034 00039 Logger::~Logger() { 00040 writeMessage(); 00041 if( m_local_identity != NULL ) { 00042 delete m_local_identity; 00043 } 00044 } 00045 00052 void Logger::setIdentity( const std::string& identity ) { 00053 Logger::_identity = identity; 00054 } 00055 00062 const std::string Logger::getIdentity() { 00063 return Logger::_identity; 00064 } 00065 00074 const int Logger::setLevel( const int level ) { 00075 00076 int old_level = Logger::_level; 00077 int l; 00078 00079 if ( level >= Logger::LEVEL_FLOOR ) { 00080 l = level; 00081 } 00082 else { 00083 l = Logger::DEFAULT_REPORTING_LEVEL; 00084 } 00085 00086 Logger::_level = l; 00087 00088 // clear the level stack and set the current value 00089 Logger::_levelStack.clear(); 00090 Logger::_levelStack.push_back( Logger::_level ); 00091 return old_level; 00092 } 00093 00100 const int Logger::getLevel() { 00101 return Logger::_level; 00102 } 00103 00104 00111 void Logger::registerWriter( LogWriter * writer ) { 00112 std::list<LogWriter *>::iterator itr; 00113 00114 for (itr = _registeredWriters.begin(); itr != _registeredWriters.end(); itr++) { 00115 if (writer->type() == (*itr)->type()) { 00116 return; 00117 } 00118 } 00119 Logger::_registeredWriters.push_back( writer ); 00120 } 00121 00122 00129 void Logger::unRegisterWriter( LogWriter * writer ) { 00130 00131 Logger::_registeredWriters.remove( writer ); 00132 } 00133 00134 00141 void Logger::pushLevel( Logger::LEVEL level ) { 00142 00143 Logger::_levelStack.push_back( Logger::_level ); 00144 00145 Logger::_level = Logger::_level | level; 00146 00147 } 00148 00149 00154 void Logger::popLevel() { 00155 00156 if( Logger::_levelStack.empty() == false ) { 00157 Logger::_level = Logger::_levelStack.back(); 00158 Logger::_levelStack.pop_back(); 00159 } 00160 } 00161 00162 00171 bool Logger::canLog( Logger::LEVEL compare ) { 00172 bool isWithin = 0; 00173 00174 if (!(_level >= Logger::LEVEL_FLOOR) || !(compare >= Logger::LEVEL_FLOOR)) { 00175 return false; 00176 } 00177 00178 isWithin = ( ( _level & compare ) != 0 ); 00179 00180 return isWithin; 00181 } 00182 00183 00190 std::ostringstream& Logger::log( Logger::LEVEL level ) { 00191 m_messageLevel = level; 00192 00193 return m_message; 00194 } 00195 00196 00204 std::ostringstream& Logger::log( Logger::LEVEL level, const std::string& identity ) { 00205 00206 if( m_local_identity == NULL ) { 00207 m_local_identity = new std::string( identity ); 00208 } 00209 return log( level ); 00210 } 00211 00212 00217 void Logger::writeMessage() { 00218 00219 for ( std::list<LogWriter *>::iterator it = Logger::_registeredWriters.begin(); it != Logger::_registeredWriters.end(); it++ ) { 00220 if( m_local_identity != NULL ) { 00221 ( *it )->write( m_messageLevel, *m_local_identity, m_message.str() ); 00222 } 00223 else { 00224 ( *it )->write( m_messageLevel, getIdentity(), m_message.str() ); 00225 } 00226 } 00227 00228 } 00229 00230 00239 std::string Logger::currentTime(const char* format) { 00240 00241 std::ostringstream dateTime; 00242 const boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); 00243 boost::posix_time::time_facet* const f = new boost::posix_time::time_facet(format); 00244 dateTime.imbue(std::locale(dateTime.getloc(),f)); 00245 dateTime << now; 00246 return dateTime.str(); 00247 } 00248 00249 00258 std::string Logger::loggerLevelAsString( Logger::LEVEL level ) { 00259 00260 std::ostringstream debugLevel; 00261 debugLevel.flags( std::ios::right ); 00262 00263 switch ( level ) { 00264 case Logger::ERROR: 00265 debugLevel << "ERROR"; 00266 break; 00267 case Logger::WARN: 00268 debugLevel << "WARN"; 00269 break; 00270 case Logger::INFO: 00271 debugLevel << "INFO"; 00272 break; 00273 case Logger::DEBUG: 00274 debugLevel << "DEBUG"; 00275 break; 00276 case Logger::DEV: 00277 debugLevel << "DEV"; 00278 break; 00279 case Logger::ALL: 00280 debugLevel << "ALL"; 00281 break; 00282 default: 00283 break; 00284 } 00285 return debugLevel.str(); 00286 } 00287 00288 00297 Logger::LEVEL Logger::stringAsLoggerLevel( std::string level_string ) { 00298 00299 Logger::LEVEL l; 00300 00301 if ( "ERROR" == level_string ) { 00302 l = Logger::ERROR; 00303 } 00304 00305 if ( "WARN" == level_string ) { 00306 l = Logger::WARN; 00307 } 00308 00309 if ( "INFO" == level_string ) { 00310 l = Logger::INFO; 00311 } 00312 00313 if ( "DEBUG" == level_string ) { 00314 l = Logger::DEBUG; 00315 } 00316 00317 if ( "DEV" == level_string ) { 00318 l = Logger::DEV; 00319 } 00320 00321 return l; 00322 00323 } 00324 00333 int Logger::levelAndBelow( Logger::LEVEL level ) { 00334 00335 int l = level; 00336 00337 if ( Logger::ERROR <= level ) { 00338 l = l | Logger::ERROR; 00339 } 00340 00341 if ( Logger::WARN <= level ) { 00342 l = l | Logger::WARN; 00343 } 00344 00345 if ( Logger::INFO <= level ) { 00346 l = l | Logger::INFO; 00347 } 00348 00349 if ( Logger::DEBUG <= level ) { 00350 l = l | Logger::DEBUG; 00351 } 00352 00353 if ( Logger::DEV <= level ) { 00354 l = l | Logger::DEV; 00355 } 00356 00357 return l; 00358 00359 } 00360 00361 } // namespace fdl
1.7.4