aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/utils/log.cpp
blob: ad9d79318a449aa73e4f25a7e1d8c11882b12205 (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