summary refs log tree commit diff
path: root/src/Logging.cpp
blob: 4ea6bae2a4545f66795d3730394930f8da6c8f02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "Logging.h"
#include "config/nheko.h"

#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include <iostream>

#include <QString>
#include <QtGlobal>

namespace {
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;
std::shared_ptr<spdlog::logger> qml_logger    = nullptr;

constexpr auto MAX_FILE_SIZE = 1024 * 1024 * 6;
constexpr auto MAX_LOG_FILES = 3;

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.endsWith(
            "QML Binding: Not restoring previous value because restoreMode has not been set.This "
            "behavior is deprecated.In Qt < 6.0 the default is Binding.RestoreBinding.In Qt >= "
            "6.0 the default is Binding.RestoreBindingOrValue.") ||
          // 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."))
                return;

        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;
        }
}
}

namespace nhlog {
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));
        qml_logger = std::make_shared<spdlog::logger>("qml", std::begin(sinks), std::end(sinks));

        if (nheko::enable_debug_log || enable_debug_log_from_commandline) {
                db_logger->set_level(spdlog::level::trace);
                ui_logger->set_level(spdlog::level::trace);
                crypto_logger->set_level(spdlog::level::trace);
                net_logger->set_level(spdlog::level::trace);
                qml_logger->set_level(spdlog::level::trace);
        }

        qInstallMessageHandler(qmlMessageHandler);
}

std::shared_ptr<spdlog::logger>
ui()
{
        return ui_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;
}

std::shared_ptr<spdlog::logger>
qml()
{
        return qml_logger;
}
}