Optimized memory usage, cleaned up api.
[quassel.git] / src / common / logger.cpp
index de20651..59efa6b 100644 (file)
  ***************************************************************************/
 
 #include "logger.h"
+#include "global.h"
 
-#include <iostream>
-
-
+#include <QFile>
+#include <QTextStream>
+#include <QDateTime>
 
 Logger::~Logger() {
-  qInstallMsgHandler(0);
+  QDateTime date = QDateTime::currentDateTime();
+  if(_logLevel == DebugLevel) _buffer.prepend("Debug: ");
+  else if (_logLevel == InfoLevel) _buffer.prepend("Info: ");
+  else if (_logLevel == WarningLevel) _buffer.prepend("Warning: ");
+  else if (_logLevel == ErrorLevel) _buffer.prepend("Error: ");
+  _buffer.prepend(date.toString("yyyy-MM-dd hh:mm:ss "));
+  log();
 }
 
-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;
+
+  if(_logLevel < lvl) return;
 
-Logger::Logger() {
-  qInstallMsgHandler(messageHandler);
+  // 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);
+      _buffer.remove(QChar('\n'));
+    }
+  }
+  out << _buffer << endl;
+  if(file.isOpen()) file.close();
 }