Skip to content

Instantly share code, notes, and snippets.

@rzhukov
Created February 12, 2014 08:38
Show Gist options
  • Save rzhukov/8951908 to your computer and use it in GitHub Desktop.
Save rzhukov/8951908 to your computer and use it in GitHub Desktop.
Simple logger for C++ like qDebug()
#pragma once
#include <ostream>
#include <sstream>
class logstream
{
private:
int _logLevel;
struct log_buf
{
std::stringstream m_Stream;
int ref;
log_buf(): ref(1) {}
} *_logbuf;
public:
enum
{
LOG_ERROR = 0,
LOG_WARNING = 1,
LOG_INFORMATION = 2
};
static int GLOBAL_LOG_LEVEL;
logstream() : _logbuf(new log_buf) { }
logstream(int logLevel) : _logLevel(logLevel), _logbuf(new log_buf()) { }
logstream(const logstream& logStream) : _logbuf(logStream._logbuf) { ++_logbuf->ref; }
~logstream()
{
if(!--_logbuf->ref)
{
if(GLOBAL_LOG_LEVEL >= _logLevel)
{
AddLog(_logbuf->m_Stream.str().c_str());
_logbuf->m_Stream.str("");
}
}
delete _logbuf;
}
template<class T>
logstream& operator << (T& s)
{
_logbuf->m_Stream << s;
return *this;
}
logstream& operator << (int s)
{
_logbuf->m_Stream << s;
return *this;
}
logstream& operator << (long s)
{
_logbuf->m_Stream << s;
return *this;
}
logstream& operator << (__int64 s)
{
_logbuf->m_Stream << s;
return *this;
}
logstream& operator << (double s)
{
_logbuf->m_Stream << s;
return *this;
}
template<>
logstream& operator << (CString& s)
{
_logbuf->m_Stream << s.GetBuffer();
return *this;
}
};
int logstream::GLOBAL_LOG_LEVEL = logstream::LOG_INFORMATION;
void LogSetLevel(int logLevel)
{
logstream::GLOBAL_LOG_LEVEL = logLevel;
}
logstream Log()
{
return logstream();
}
logstream LogE()
{
return logstream(logstream::LOG_ERROR);
}
logstream LogW()
{
return logstream(logstream::LOG_WARNING);
}
logstream LogI()
{
return logstream(logstream::LOG_INFORMATION);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment