-
Notifications
You must be signed in to change notification settings - Fork 153
/
Copy pathxRedisLog.cpp
79 lines (66 loc) · 1.95 KB
/
xRedisLog.cpp
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
/*
* ----------------------------------------------------------------------------
* Copyright (c) 2013-2021, xSky <guozhw at gmail dot com>
* All rights reserved.
* Distributed under GPL license.
* ----------------------------------------------------------------------------
*/
#include "xRedisLog.h"
#include <stdarg.h>
#include <time.h>
namespace xrc {
const char* const _errstr[] = { "\033[01;31mERROR\033[0m", "\033[01;33mWARN \033[0m", "\033[01;37mINFO \033[0m", "\033[22;34mDEBUG\033[0m" };
static void (*log_fn)(int level, const char* line) = NULL;
uint32_t _level = LOG_LEVEL_INFO;
void set_log_level(uint32_t level, void (*call_fn)(int level, const char* line))
{
_level = level;
log_fn = call_fn;
}
void log_message(uint32_t level, const char* function, int line, const char* fmt, ...)
{
if (level > _level) {
return;
}
time_t t;
time(&t);
struct tm tm;
#ifdef _WIN32
::localtime_s(&tm, (const time_t*)&t);
#else
::localtime_r((const time_t*)&t, &tm);
#endif
char data1[DATA_BUF + 4];
int i = 0;
va_list args;
va_start(args, fmt);
i = vsnprintf(data1, DATA_BUF, fmt, args);
va_end(args);
if (i > (int)DATA_BUF - 1) {
i = DATA_BUF - 5;
data1[i++] = '.';
data1[i++] = '.';
data1[i++] = '.';
data1[i++] = '\n';
data1[i] = '\0';
} else {
if (i > 0) {
if (data1[i - 1] != '\n') {
data1[i++] = '\n';
data1[i] = '\0';
}
}
}
while (data1[i - 2] == '\n')
i--;
data1[i] = '\0';
if (log_fn) {
log_fn(level, data1);
} else {
printf("[%04d-%02d-%02d %02d:%02d:%02d] %-5s %s:%d %s",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec,
_errstr[level], function, line, data1);
}
}
} // namespace xrc