aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/utils/log.cpp
blob: 560afa8b20b993fe1920d44f2a56cabde0d2ed59 (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
#define LOGHELPER_IMPLEMENT
#include "log.h"

#define hasbit(flag, bit) ((flag & bit) == bit)

unsigned int Loghelper::dir = Loghelper::Direction::DIR_CERR;
unsigned int Loghelper::levels = Loghelper::Level::LV_ALL;
std::ofstream Loghelper::fs;

void Loghelper::log(Level _level, const char* _fmt, ...)
{
    if (!hasbit(levels, _level))
        return;
#define FORMAT_MSG_BUFFER_SIZE (204800)  
    const char* levelStr = nullptr;
    switch (_level)
    {
    case LV_ERROR:
        levelStr = "[Jin Error]: ";
        break;
    case LV_WARNING:
        levelStr = "[Jin Warning]: ";
        break;
    case LV_INFO:
        levelStr = "[Jin Info]: ";
        break;
    case LV_DEBUG:
        levelStr = "[Jin Debug]: ";
        break;
    default:
        levelStr = "[Jin Unknow]: ";
        break;
    }
    char buffer[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 };
    strcpy(buffer, levelStr);
    va_list args;
    va_start(args, _fmt);
    vsnprintf(buffer + strlen(buffer), FORMAT_MSG_BUFFER_SIZE, _fmt, args);
    va_end(args);
    if (hasbit(dir, DIR_CERR))
    {
        std::cerr << buffer << std::endl;
    }
    if (hasbit(dir, DIR_FILE))
    {
        fs << buffer << std::endl;
    }
#undef FORMAT_MSG_BUFFER_SIZE
}

// ض
void Loghelper::redirect(unsigned int _dir, char* _path)
{
    dir = _dir;
    if (hasbit(dir, DIR_FILE))
    {
        try
        {
            fs.open(_path, std::ios_base::app);
        }
        catch (std::ios_base::failure& e) {
            dir = DIR_CERR;
            log(Level::LV_WARNING, "ضlog· %s ʧ", _path);
        }
    }
}

// ɸѡȼ
void Loghelper::restrict(unsigned int _levels)
{
    levels = _levels;
}

void Loghelper::close()
{
    if (!fs.fail())
        fs.close();
    fs.clear();
}

#undef hasbit