From: Sebastian Goth Date: Thu, 24 Jul 2008 16:05:35 +0000 (+0200) Subject: Initial commit of logger. X-Git-Tag: 0.3.0~200 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=6b75ac568098c17de5f0a98ce0d96781b86e98b3 Initial commit of logger. Replaces old inactive files. --- diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index ddccfb9e..1c890fcb 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -35,7 +35,6 @@ set(MOC_HDRS ircchannel.h irclisthelper.h ircuser.h - logger.h network.h signalproxy.h syncableobject.h) @@ -43,6 +42,7 @@ set(MOC_HDRS set(HEADERS ${MOC_HDRS} bufferinfo.h global.h + logger.h message.h settings.h types.h diff --git a/src/common/logger.cpp b/src/common/logger.cpp index 6047042c..5d7c64a3 100644 --- a/src/common/logger.cpp +++ b/src/common/logger.cpp @@ -19,31 +19,43 @@ ***************************************************************************/ #include "logger.h" +#include "global.h" -#include -#include +#include +#include +#include Logger::~Logger() { - qInstallMsgHandler(0); + QDateTime date = QDateTime::currentDateTime(); + if(stream->logLevel == DebugLevel) stream->buffer.prepend("Debug: "); + else if (stream->logLevel == InfoLevel) stream->buffer.prepend("Info: "); + else if (stream->logLevel == WarningLevel) stream->buffer.prepend("Warning: "); + else if (stream->logLevel == ErrorLevel) stream->buffer.prepend("Error: "); + stream->buffer.prepend(date.toString("yyyy-MM-dd hh:mm:ss ")); + log(); + delete stream; } -void messageHandler(QtMsgType type, const char *msg) { - switch (type) { - case QtDebugMsg: - std::cerr << "[DEBUG] " << msg << "\n"; - break; - case QtWarningMsg: - std::cerr << "[WARNING] " << msg << "\n"; - break; - case QtCriticalMsg: - std::cerr << "[CRITICAL] " << msg << "\n"; - break; - case QtFatalMsg: - std::cerr << "[FATAL] " << msg << "\n"; - abort(); // deliberately core dump - } -} +void Logger::log() { + LogLevel lvl; + if (Global::parser.value("loglevel") == "Debug") lvl = DebugLevel; + else if (Global::parser.value("loglevel") == "Info") lvl = InfoLevel; + else if (Global::parser.value("loglevel") == "Warning") lvl = WarningLevel; + else if (Global::parser.value("loglevel") == "Error") lvl = ErrorLevel; + else lvl = InfoLevel; -Logger::Logger() { - qInstallMsgHandler(messageHandler); + if(stream->logLevel < lvl) return; + + // if we can't open logfile we log to stdout + QTextStream out(stdout); + QFile file; + if(!Global::parser.value("logfile").isEmpty()) { + file.setFileName(Global::parser.value("logfile")); + if (file.open(QIODevice::Append | QIODevice::Text)) { + out.setDevice(&file); + stream->buffer.remove(QChar('\n')); + } + } + out << stream->buffer << "\n"; + if(file.isOpen()) file.close(); } diff --git a/src/common/logger.h b/src/common/logger.h index 168b3bdd..f49d270d 100644 --- a/src/common/logger.h +++ b/src/common/logger.h @@ -21,21 +21,55 @@ #ifndef _LOGGER_H_ #define _LOGGER_H_ -#include - -class Logger : public QObject { - Q_OBJECT +#include +#include +class Logger { public: - Logger(); - virtual ~Logger(); + enum LogLevel { + DebugLevel, + InfoLevel, + WarningLevel, + ErrorLevel + }; + inline Logger(LogLevel level) : stream(new Stream(level)) {} + ~Logger(); + inline Logger &operator<<(const char* t) { stream->internalStream << QString::fromAscii(t); return *this; } + inline Logger &operator<<(QChar t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(bool t) { stream->internalStream << (t ? "true" : "false"); return *this; } + inline Logger &operator<<(char t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(signed short t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(unsigned short t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(signed int t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(unsigned int t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(signed long t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(unsigned long t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(qint64 t) { stream->internalStream << QString::number(t); return *this; } + inline Logger &operator<<(quint64 t) { stream->internalStream << QString::number(t); return *this; } + inline Logger &operator<<(float t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(double t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(const QString & t) { stream->internalStream << t; return *this; } + inline Logger &operator<<(const QLatin1String &t) { stream->internalStream << t.latin1(); return *this; } + inline Logger &operator<<(const QByteArray & t) { stream->internalStream << t ; return *this; } + inline Logger &operator<<(const void * t) { stream->internalStream << t; return *this; } + void log(); private: - //void messageHandler(QtMsgType type, const char *msg); + struct Stream { + Stream(LogLevel level) + : internalStream(&buffer, QIODevice::WriteOnly), + logLevel(level) {} + QTextStream internalStream; + QString buffer; + LogLevel logLevel; + } *stream; }; - +inline Logger quDebug() { return Logger(Logger::DebugLevel); } +inline Logger quInfo() { return Logger(Logger::InfoLevel); } +inline Logger quWarning() { return Logger(Logger::WarningLevel); } +inline Logger quError() { return Logger(Logger::ErrorLevel); } #endif