#include "mars_log.h" #include #include namespace mars { Log g_log; Log::Log( const std::string & sFilename /*= "mars.log"*/, const Level enLevel /*= Fatal*/, const unsigned int enSettings /*= Function | Time*/ ) : _outfile(sFilename), _tTimeStart(time(NULL)), _enSettings(enSettings), _enLevel(enLevel) { _outfile << "Log started, be nice" << std::endl; } Log::~Log() { _outfile.close(); } mars::Outputter Log::stream( const Level enLevel /*= Log::Info*/, const char * szFile /*= NULL*/, const char * szFunction /*= NULL*/, const unsigned int nLine /*= 0*/ ) { if (enLevel <= _enLevel) return Outputter(&_outfile, _enSettings, &_mutex, time(NULL) - _tTimeStart, szFile, nLine, szFunction, boost::this_thread::get_id()); else return Outputter(); } Log & Log::getSingleton() { return g_log; } Outputter::Outputter() : _pOut(NULL), _pMutex(NULL) {} Outputter::Outputter( std::ofstream * pOut, const unsigned int enSettings, boost::mutex * pMutex, const time_t & tTime, const char * szFile, const unsigned int nLine, const char * szFunction, const boost::thread::id & idThread ) : _pOut (pOut), _pMutex(pMutex) { _pMutex->lock(); if (enSettings & Log_Time) *_pOut << std::put_time(std::localtime(&tTime), "HMS"); if ((enSettings & Log_File) != 0 && szFile != NULL) *_pOut << " " << szFile; if ((enSettings & Log_Line) != 0 && nLine > 0) *_pOut << " (" << nLine << ")"; if ((enSettings & Log_Function) != 0 && szFunction != NULL) *_pOut << " " << szFunction; if ((enSettings & Log_Thread)) *_pOut << " - [thread:" << idThread << "]"; *_pOut << ": \t"; } Outputter::~Outputter() { if (_pOut != NULL && _pMutex != NULL) { *_pOut << std::endl; _pOut->flush(); _pMutex->unlock(); } } }