Skip to content
Snippets Groups Projects
Logging.cpp 4.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "Logging.h"
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    #include "config/nheko.h"
    
    #include "spdlog/sinks/rotating_file_sink.h"
    
    #include "spdlog/sinks/stdout_color_sinks.h"
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    #include <QString>
    #include <QtGlobal>
    
    
    std::shared_ptr<spdlog::logger> db_logger     = nullptr;
    std::shared_ptr<spdlog::logger> net_logger    = nullptr;
    std::shared_ptr<spdlog::logger> crypto_logger = nullptr;
    
    std::shared_ptr<spdlog::logger> ui_logger     = nullptr;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    std::shared_ptr<spdlog::logger> qml_logger    = nullptr;
    
    
    constexpr auto MAX_FILE_SIZE = 1024 * 1024 * 6;
    constexpr auto MAX_LOG_FILES = 3;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    void
    qmlMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    {
            std::string localMsg = msg.toStdString();
            const char *file     = context.file ? context.file : "";
            const char *function = context.function ? context.function : "";
    
            if (
              // Surpress binding wrning for now, as we can't set restore mode to keep compat with
              // qt 5.10
    
              msg.contains(
                "QML Binding: Not restoring previous value because restoreMode has not been set.") ||
    
              // The default style has the point size set. If you use pixel size anywhere, you get
              // that warning, which is useless, since sometimes you need the pixel size to match the
              // text to the size of the outer element for example. This is done in the avatar and
              // without that you get one warning for every Avatar displayed, which is stupid!
              msg.endsWith("Both point size and pixel size set. Using pixel size."))
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            switch (type) {
            case QtDebugMsg:
                    nhlog::qml()->debug("{} ({}:{}, {})", localMsg, file, context.line, function);
                    break;
            case QtInfoMsg:
                    nhlog::qml()->info("{} ({}:{}, {})", localMsg, file, context.line, function);
                    break;
            case QtWarningMsg:
                    nhlog::qml()->warn("{} ({}:{}, {})", localMsg, file, context.line, function);
                    break;
            case QtCriticalMsg:
                    nhlog::qml()->critical("{} ({}:{}, {})", localMsg, file, context.line, function);
                    break;
            case QtFatalMsg:
                    nhlog::qml()->critical("{} ({}:{}, {})", localMsg, file, context.line, function);
                    break;
            }
    }
    
    bool enable_debug_log_from_commandline = false;
    
    
    void
    init(const std::string &file_path)
    {
            auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
              file_path, MAX_FILE_SIZE, MAX_LOG_FILES);
    
    
            auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
    
    
            std::vector<spdlog::sink_ptr> sinks;
            sinks.push_back(file_sink);
            sinks.push_back(console_sink);
    
    
            net_logger = std::make_shared<spdlog::logger>("net", std::begin(sinks), std::end(sinks));
            ui_logger  = std::make_shared<spdlog::logger>("ui", std::begin(sinks), std::end(sinks));
            db_logger  = std::make_shared<spdlog::logger>("db", std::begin(sinks), std::end(sinks));
    
            crypto_logger =
              std::make_shared<spdlog::logger>("crypto", std::begin(sinks), std::end(sinks));
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            qml_logger = std::make_shared<spdlog::logger>("qml", std::begin(sinks), std::end(sinks));
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            if (nheko::enable_debug_log || enable_debug_log_from_commandline) {
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
                    db_logger->set_level(spdlog::level::trace);
                    ui_logger->set_level(spdlog::level::trace);
                    crypto_logger->set_level(spdlog::level::trace);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                    net_logger->set_level(spdlog::level::trace);
                    qml_logger->set_level(spdlog::level::trace);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
            qInstallMessageHandler(qmlMessageHandler);
    
    }
    
    std::shared_ptr<spdlog::logger>
    
    }
    
    std::shared_ptr<spdlog::logger>
    net()
    {
            return net_logger;
    }
    
    std::shared_ptr<spdlog::logger>
    db()
    {
            return db_logger;
    }
    
    
    std::shared_ptr<spdlog::logger>
    crypto()
    {
            return crypto_logger;
    }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    std::shared_ptr<spdlog::logger>
    qml()
    {
            return qml_logger;
    }