-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLogger.hpp
More file actions
129 lines (115 loc) · 4.16 KB
/
Copy pathLogger.hpp
File metadata and controls
129 lines (115 loc) · 4.16 KB
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
#ifndef LOGGER_HPP
#define LOGGER_HPP
#include <cstdio>
#include <cstdarg>
#include <mutex>
#include <windows.h>
namespace Logger {
enum class LogLevel {
Info,
Warn,
Error
};
//使用互斥锁防止多线程调用出现异常
inline std::mutex log_mutex;
/**
* HANDLE GetStdHandle(DWORD nStdHandle) 获取标准输入、输出或错误设备的句柄(屏幕缓冲区句柄)
*
* nStdHandle 标准设备类型,可以是以下值:
* - STD_INPUT_HANDLE (DWORD)-10 // 标准输入(键盘)的句柄
* - STD_OUTPUT_HANDLE (DWORD)-11 // 标准输出(控制台屏幕)的句柄
* - STD_ERROR_HANDLE (DWORD)-12 // 标准错误(错误信息输出)的句柄
*
* 成功返回设备句柄(HANDLE),失败返回 INVALID_HANDLE_VALUE
*
* Windows 控制台颜色 (用于 SetConsoleTextAttribute)
*
* 颜色采用 4-bit 编码,格式为 0xXY:
* - X (高4位): 背景色
* - Y (低4位): 前景色(文字颜色)
*
* 基础颜色值 (可组合使用):
* 0x0: 黑色 0x1: 深蓝色
* 0x2: 深绿色 0x3: 深青色
* 0x4: 深红色 0x5: 深紫色
* 0x6: 深黄色 0x7: 灰色(默认)
* 0x8: 深灰色 0x9: 蓝色
* 0xA: 绿色 0xB: 青色
* 0xC: 红色 0xD: 紫色
* 0xE: 黄色 0xF: 白色
*
* 常用组合示例:
* 0x07: 灰字黑底(默认) 0x70: 黑字灰底(反色)
* 0x0F: 白字黑底 0xF0: 黑字白底
* 0x04: 红字黑底 0x40: 黑字红底
* 0x0A: 绿字黑底 0xA0: 黑字绿底
* 0x0E: 黄字黑底 0xE0: 黑字黄底
*
* 特殊组合:
* - 添加 FOREGROUND_INTENSITY(0x08) 使前景色变亮
* - 添加 BACKGROUND_INTENSITY(0x80) 使背景色变亮
* 例如:0x0C 是深红色,0x0F 是亮白色
*/
inline void Print(LogLevel level, const char* fmt, va_list args) {
std::lock_guard<std::mutex> lock(log_mutex);//这里加锁防止线程冲突
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
switch (level) {
case LogLevel::Info:
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("[");
SetConsoleTextAttribute(hConsole, 0x2);//设置为绿色
printf("Info");
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("] ");
break;
case LogLevel::Error:
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("[");
SetConsoleTextAttribute(hConsole, 0x4);//设置为红色
printf("Error");
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("] ");
break;
case LogLevel::Warn:
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("[");
SetConsoleTextAttribute(hConsole, 0x6);//设置为黄色
printf("Warn");
SetConsoleTextAttribute(hConsole, 0x7);//设置为默认灰色
printf("] ");
break;
default:
printf("[Log] ");
break;
}
vprintf(fmt, args);
printf("\n");
}
inline void Info(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
Print(LogLevel::Info, fmt, args);
va_end(args);
}
inline void Warn(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
Print(LogLevel::Warn, fmt, args);
va_end(args);
}
inline void Error(bool ifexit,int exitsleep,const char* fmt, ...) {
va_list args;
va_start(args, fmt);
Print(LogLevel::Error, fmt, args);
va_end(args);
if (ifexit)
{
if (exitsleep <= 0) exitsleep = 1;
char cmd[64];
sprintf_s(cmd, sizeof(cmd), "timeout /t %d", exitsleep);
system(cmd);
exit(1);
}
}
} // namespace Logger
#endif // LOGGER_HPP