aboutsummaryrefslogtreecommitdiff
path: root/core/logger.c
blob: efff3dccb321c8a5f775cbb865ad2fb21afe35b9 (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
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
#include <assert.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>

#define LOG_LINE_SIZE 1024

enum LogLevel {
    INFO,
    WARN,
};

char g_log_buff[LOG_LINE_SIZE];

void log_msg_to_buff(char *out, int size, enum LogLevel level, bool colored, const char *format, va_list args) {
    assert(out);
    assert(size);
    assert(level == INFO || level == WARN);
    assert(format);

    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    long msec = ts.tv_nsec / 1000000;
    struct tm tm = *localtime(&ts.tv_sec);
    pid_t pid = getpid();
    const char *level_str = NULL;

    switch (level) {
    case INFO:
        level_str = "INFO";
        break;
    case WARN:
        level_str = "WARN";
        break;
    default:
        assert(false);
    }

    const char *color_code = NULL;
    if (colored) {
        switch (level) {
        case INFO:
            color_code = "\033[1;32m";
            break;
        case WARN:
            color_code = "\033[1;33m";
            break;
        default:
            assert(false);
        }
    }

    // Imitate formatting style configured in 'salis.py'
    int col = snprintf(
        out,
        size,
        "%s%d-%02d-%02d %02d:%02d:%02d,%03ld %07d [%s]%s ",
        colored ? color_code : "",
        tm.tm_year + 1900,
        tm.tm_mon + 1,
        tm.tm_mday,
        tm.tm_hour,
        tm.tm_min,
        tm.tm_sec,
        msec,
        pid,
        level_str,
        colored ? "\033[0m" : ""
    );

    vsnprintf(out + col, size - col, format, args);
}

void log_msg(enum LogLevel level, bool colored, const char *format, va_list args) {
    assert(level == INFO || level == WARN);
    assert(format);

    log_msg_to_buff(g_log_buff, LOG_LINE_SIZE, level, colored, format, args);
    printf("\r%s\n", g_log_buff);
}

void log_info(const char *format, ...) {
    assert(format);

    va_list args;
    va_start(args, format);
    log_msg(INFO, true, format, args);
    va_end(args);
}

void log_warn(const char *format, ...) {
    assert(format);

    va_list args;
    va_start(args, format);
    log_msg(WARN, true, format, args);
    va_end(args);
}