logger: resolve program name using RunMode and BuildInfo
[quassel.git] / src / common / logger.cpp
index ed8d802..d17e182 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2018 by the Quassel Project                        *
+ *   Copyright (C) 2005-2019 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -21,7 +21,7 @@
 #include <iostream>
 
 #ifdef HAVE_SYSLOG
-#  include <syslog.h>
+#    include <syslog.h>
 #endif
 
 #include <QByteArray>
 
 #include "logger.h"
 #include "quassel.h"
+#include "types.h"
 
 namespace {
 
-QByteArray msgWithTime(const Logger::LogEntry &msg)
+QByteArray msgWithTime(const Logger::LogEntrymsg)
 {
-    return (msg.timeStamp.toString("yyyy-MM-dd hh:mm:ss ") + msg.message + "\n").toUtf8();
-};
+    QString levelString;
 
+    switch (msg.logLevel) {
+        case Logger::LogLevel::Debug:
+            levelString = "[Debug] ";
+            break;
+        case Logger::LogLevel::Info:
+            levelString = "[Info ] ";
+            break;
+        case Logger::LogLevel::Warning:
+            levelString = "[Warn ] ";
+            break;
+        case Logger::LogLevel::Error:
+            levelString = "[Error] ";
+            break;
+        case Logger::LogLevel::Fatal:
+            levelString = "[FATAL] ";
+            break;
+    }
+
+    return (msg.timeStamp.toString("yyyy-MM-dd hh:mm:ss ") + levelString + msg.message + "\n").toUtf8();
 }
 
+}  // namespace
 
-Logger::Logger(QObject *parent)
+Logger::Logger(QObjectparent)
     : QObject(parent)
 {
     static bool registered = []() {
@@ -51,34 +71,27 @@ Logger::Logger(QObject *parent)
     }();
     Q_UNUSED(registered)
 
-    connect(this, SIGNAL(messageLogged(Logger::LogEntry)), this, SLOT(onMessageLogged(Logger::LogEntry)));
+    connect(this, &Logger::messageLogged, this, &Logger::onMessageLogged);
 
-#if QT_VERSION < 0x050000
-    qInstallMsgHandler(Logger::messageHandler);
-#else
     qInstallMessageHandler(Logger::messageHandler);
-#endif
 }
 
-
 Logger::~Logger()
 {
     // If we're not initialized yet, output pending messages so they don't get lost
     if (!_initialized) {
-        for (auto &&message : _messages) {
+        for (auto&& message : _messages) {
             std::cerr << msgWithTime(message).constData();
         }
     }
 }
 
-
 std::vector<Logger::LogEntry> Logger::messages() const
 {
     return _messages;
 }
 
-
-bool Logger::setup(bool keepMessages)
+void Logger::setup(bool keepMessages)
 {
     _keepMessages = keepMessages;
 
@@ -94,63 +107,69 @@ bool Logger::setup(bool keepMessages)
         else if (level == "error")
             _outputLevel = LogLevel::Error;
         else {
-            qCritical() << qPrintable(tr("Invalid log level %1; supported are Debug|Info|Warning|Error").arg(level));
-            return false;
+            throw ExitException{EXIT_FAILURE, qPrintable(tr("Invalid log level %1; supported are Debug|Info|Warning|Error").arg(level))};
         }
     }
 
     QString logfilename = Quassel::optionValue("logfile");
     if (!logfilename.isEmpty()) {
         _logFile.setFileName(logfilename);
-        if (!_logFile.open(QFile::Append|QFile::Unbuffered|QFile::Text)) {
+        if (!_logFile.open(QFile::Append | QFile::Unbuffered | QFile::Text)) {
             qCritical() << qPrintable(tr("Could not open log file \"%1\": %2").arg(logfilename, _logFile.errorString()));
         }
     }
     if (!_logFile.isOpen()) {
-        if (!_logFile.open(stderr, QFile::WriteOnly|QFile::Unbuffered|QFile::Text)) {
+        if (!_logFile.open(stderr, QFile::WriteOnly | QFile::Unbuffered | QFile::Text)) {
             qCritical() << qPrintable(tr("Cannot write to stderr: %1").arg(_logFile.errorString()));
         }
     }
 
 #ifdef HAVE_SYSLOG
     _syslogEnabled = Quassel::isOptionSet("syslog");
+
+    Quassel::RunMode mode = Quassel::runMode();
+    Quassel::BuildInfo info = Quassel::buildInfo();
+    QString prgname = info.applicationName;
+
+    if (mode == Quassel::RunMode::ClientOnly) {
+        prgname = info.clientApplicationName;
+    } else if (mode == Quassel::RunMode::CoreOnly) {
+        prgname = info.coreApplicationName;
+    }
+
+    _prgname = prgname.toLocal8Bit();
+
+    // set up options, program name, and facility for later calls to syslog(3)
+    if (_syslogEnabled) {
+        openlog(_prgname.constData(), LOG_PID, LOG_USER);
+    }
 #endif
 
     _initialized = true;
 
     // Now that we've setup our logging backends, output pending messages
-    for (auto &&message : _messages) {
+    for (auto&& message : _messages) {
         outputMessage(message);
     }
     if (!_keepMessages) {
         _messages.clear();
     }
-
-    return true;
 }
 
-
-#if QT_VERSION < 0x050000
-void Logger::messageHandler(QtMsgType type, const char *message)
-#else
-void Logger::messageHandler(QtMsgType type, const QMessageLogContext &, const QString &message)
-#endif
+void Logger::messageHandler(QtMsgType type, const QMessageLogContext&, const QString& message)
 {
     Quassel::instance()->logger()->handleMessage(type, message);
 }
 
-
-void Logger::handleMessage(QtMsgType type, const QString &msg)
+void Logger::handleMessage(QtMsgType type, const QString& msg)
 {
     switch (type) {
     case QtDebugMsg:
         handleMessage(LogLevel::Debug, msg);
         break;
-#if QT_VERSION >= 0x050500
     case QtInfoMsg:
         handleMessage(LogLevel::Info, msg);
         break;
-#endif
     case QtWarningMsg:
         handleMessage(LogLevel::Warning, msg);
         break;
@@ -163,35 +182,13 @@ void Logger::handleMessage(QtMsgType type, const QString &msg)
     }
 }
 
-
-void Logger::handleMessage(LogLevel level, const QString &msg)
+void Logger::handleMessage(LogLevel level, const QString& msg)
 {
-    QString logString;
-
-    switch (level) {
-    case LogLevel::Debug:
-        logString = "[Debug] ";
-        break;
-    case LogLevel::Info:
-        logString = "[Info ] ";
-        break;
-    case LogLevel::Warning:
-        logString = "[Warn ] ";
-        break;
-    case LogLevel::Error:
-        logString = "[Error] ";
-        break;
-    case LogLevel::Fatal:
-        logString = "[FATAL] ";
-        break;
-    }
-
     // Use signal connection to make this method thread-safe
-    emit messageLogged({QDateTime::currentDateTime(), level, logString += msg});
+    emit messageLogged({QDateTime::currentDateTime(), level, msg});
 }
 
-
-void Logger::onMessageLogged(const LogEntry &message)
+void Logger::onMessageLogged(const LogEntry& message)
 {
     if (_keepMessages) {
         _messages.push_back(message);
@@ -203,8 +200,7 @@ void Logger::onMessageLogged(const LogEntry &message)
     }
 }
 
-
-void Logger::outputMessage(const LogEntry &message)
+void Logger::outputMessage(const LogEntry& message)
 {
     if (message.logLevel < _outputLevel) {
         return;
@@ -229,7 +225,7 @@ void Logger::outputMessage(const LogEntry &message)
         case LogLevel::Fatal:
             prio = LOG_CRIT;
         }
-        syslog(prio|LOG_USER, "%s", qPrintable(message.message));
+        syslog(prio, "%s", qPrintable(message.message));
     }
 #endif
 
@@ -247,5 +243,4 @@ void Logger::outputMessage(const LogEntry &message)
         }
     }
 #endif
-
 }