Fluid Dynamics Library
logger.cpp
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