aboutsummaryrefslogtreecommitdiff
path: root/src/internal/logging.h
blob: fb0e41502439a6e5a616bf7731bb017ece1f6c26 (plain)
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
#ifndef LOGGING_H
#define LOGGING_H

#include <iostream>
#include <chrono>

#include "plugin.h"
#include "spdlog/sinks/base_sink.h"

using spdlog_base_sink = spdlog::sinks::base_sink<std::mutex>;

class PluginSink : public  spdlog_base_sink
{
public:

    PluginSink(loggerfunc_t logger): spdlog_base_sink()
    {
        this->ns_logger_ = logger;
    }

    void sink_it_(const spdlog::details::log_msg& in_msg) override
    {
        LogMsg msg{};
        std::string payload(in_msg.payload.data(), in_msg.payload.size());
        msg.level = (int)in_msg.level;
        msg.msg = payload.c_str();
        msg.timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(in_msg.time.time_since_epoch()).count();
        msg.source.file = in_msg.source.filename;
        msg.source.func = in_msg.source.funcname;
        msg.source.line = in_msg.source.line;
        this->ns_logger_(&msg);
    }

    void flush_() override
    {
        std::cout << std::flush;
    }

protected:
    loggerfunc_t ns_logger_;

    // sink log level - default is all
    spdlog::level_t level_{ spdlog::level::trace };
};

#endif