~aleteoryx/muditaos

ref: 66415929584a3f3a7d3fe87ed8eae0e0e96596b7 muditaos/module-utils/board/linux/log.cpp -rw-r--r-- 3.9 KiB
66415929 — Wiktor S. Ovalle Correa [EGD-4712] Change quickstart.md to reflect current project state 5 years ago
                                                                                
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
125
126
127
128
129
130
131
132
133
134
135
136
137
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "../../log/log.hpp"
#include <iostream>
#include <string>
#include <mutex>
#include <ticks.hpp>
#include <fstream>
#include <string_view>

#define LOGGER_BUFFER_SIZE 4096

#define CONSOLE_ESCAPE_COLOR_BLACK   "\x1b[30m"
#define CONSOLE_ESCAPE_COLOR_RED     "\x1b[31m"
#define CONSOLE_ESCAPE_COLOR_GREEN   "\x1b[32m"
#define CONSOLE_ESCAPE_COLOR_YELLOW  "\x1b[33m"
#define CONSOLE_ESCAPE_COLOR_BLUE    "\x1b[34m"
#define CONSOLE_ESCAPE_COLOR_MAGENTA "\x1b[35m"
#define CONSOLE_ESCAPE_COLOR_CYAN    "\x1b[36m"
#define CONSOLE_ESCAPE_COLOR_WHITE   "\x1b[37m"
#define CONSOLE_ESCAPE_COLOR_RESET   "\x1b[0m"

#define CONSOLE_ESCAPE_COLOR_BACKGROUND_BLACK   "\x1b[40m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_RED     "\x1b[41m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_GREEN   "\x1b[42m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_YELLOW  "\x1b[43m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_BLUE    "\x1b[44m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_MAGENTA "\x1b[45m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_CYAN    "\x1b[46m"
#define CONSOLE_ESCAPE_COLOR_BACKGROUND_WHITE   "\x1b[47m"

const char *level_names[] = {"TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"};

#if LOG_USE_COLOR == 1
static const char *level_colors[] = {"\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"};
#endif

struct Logger
{
    Logger(logger_level level = LOGTRACE) : level{level}
    {}

    std::mutex lock;
    logger_level level;
};

static Logger logger;
static char loggerBuffer[LOGGER_BUFFER_SIZE] = {0};

void dumpToFile(std::string_view log, size_t length)
{
    static std::fstream logFile(logFileName, std::fstream::out);
    logFile.write(log.data(), length);
    logFile.flush();
}

void log_Printf(const char *fmt, ...)
{
    /* Acquire lock */
    std::lock_guard<std::mutex> guard(logger.lock);
    char *ptr = loggerBuffer;
    ptr[0]    = 0;
    va_list args;

    va_start(args, fmt);
    ptr += vsnprintf(ptr, LOGGER_BUFFER_SIZE - 1, fmt, args);
    va_end(args);

    std::cout << loggerBuffer;
    dumpToFile(loggerBuffer, ptr - loggerBuffer);
}

static void _log_Log(
    logger_level level, const char *file, int line, const char *function, const char *fmt, va_list args)
{
    if (level < logger.level) {
        return;
    }

    std::lock_guard<std::mutex> guard(logger.lock);

    char *ptr = loggerBuffer;

    ptr += snprintf(ptr,
                    &loggerBuffer[LOGGER_BUFFER_SIZE] - ptr,
                    "%d ms ",
                    cpp_freertos::Ticks::TicksToMs(cpp_freertos::Ticks::GetTicks()));

#if LOG_USE_COLOR == 1
    ptr += snprintf(ptr,
                    &loggerBuffer[LOGGER_BUFFER_SIZE] - ptr,
                    "%s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",
                    level_colors[level],
                    level_names[level],
                    file,
                    line);
#else
    ptr += snprintf(
        ptr, &loggerBuffer[LOGGER_BUFFER_SIZE] - ptr, "%-5s %s:%s:%d: ", level_names[level], file, function, line);
#endif
    ptr += vsnprintf(ptr, &loggerBuffer[LOGGER_BUFFER_SIZE] - ptr, fmt, args);
    ptr += snprintf(ptr, &loggerBuffer[LOGGER_BUFFER_SIZE] - ptr, "\n");

    std::cout << loggerBuffer;
    dumpToFile(loggerBuffer, ptr - loggerBuffer);
}

__attribute__((weak)) void log_Log(
    logger_level level, const char *file, int line, const char *function, const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    _log_Log(level, file, line, function, fmt, args);
    va_end(args);
}

/**
 * Update log level
 * @param level [in] - new log level
 */
void log_SetLevel(logger_level level)
{
    logger.level = level;
}

extern "C"
{

    void bt_log_custom(const char *file, int line, const char *foo, const char *fmt, ...)
    {
        va_list args;
        va_start(args, fmt);
        _log_Log(LOGTRACE, file, line, foo, fmt, args);
        va_end(args);
    }
};