4
4
#include < iostream>
5
5
#include < sstream>
6
6
7
+ #if _WIN32
8
+
9
+ #include < windows.h>
10
+
11
+ #endif
12
+
7
13
std::string Logger::logLevelToString (const LogLevel level) {
8
14
switch (level) {
9
- case LogLevel::FATAL : return " [FTL]" ;
10
- case LogLevel::ERROR : return " [ERR]" ;
11
- case LogLevel::WARNING : return " [WRN]" ;
12
- case LogLevel::INFO : return " [INF]" ;
15
+ case LogLevel::Fatal : return " [FTL]" ;
16
+ case LogLevel::Error : return " [ERR]" ;
17
+ case LogLevel::Warning : return " [WRN]" ;
18
+ case LogLevel::Info : return " [INF]" ;
13
19
default :
14
- log (LogLevel::ERROR ) << " Invalid log level specified!" ;
20
+ log (LogLevel::Error ) << " Invalid log level specified!" ;
15
21
return " \0 " ;
16
22
}
17
23
}
@@ -26,6 +32,40 @@ std::string Logger::getTimestamp() {
26
32
return ' [' + currentTimeString + ' ]' ;
27
33
}
28
34
35
+ #if _WIN32
36
+
37
+ int Logger::getColor (const LogLevel level) {
38
+ switch (level) {
39
+ case LogLevel::Fatal: return 0x0C ; // Red
40
+ case LogLevel::Error: return 0x0C ; // Red
41
+ case LogLevel::Warning: return 0x0E ; // Yellow
42
+ case LogLevel::Info: return 0x09 ; // Blue
43
+ default :
44
+ log (LogLevel::Error) << " Invalid log level specified!" ;
45
+ return 0x0F ;
46
+ }
47
+ }
48
+
49
+ void Logger::setWindowsColor (const int color) {
50
+ SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
51
+ }
52
+
53
+ #else
54
+
55
+ std::string Logger::getColor (const LogLevel level) {
56
+ switch (level) {
57
+ case LogLevel::Fatal: return " \033 [1;31m" ; // Red
58
+ case LogLevel::Error: return " \033 [0;31m" ; // Light red
59
+ case LogLevel::Warning: return " \033 [0;33m" ; // Yellow
60
+ case LogLevel::Info: return " \033 [0;34m" ; // Blue
61
+ default :
62
+ log (LogLevel::Error) << " Invalid log level specified!" ;
63
+ return " \033 [0m" ;
64
+ }
65
+ }
66
+
67
+ #endif
68
+
29
69
Logger::LoggerStream::LoggerStream (const LogLevel level)
30
70
: messageLogLevel(level) {
31
71
}
@@ -35,16 +75,37 @@ Logger::LoggerStream::~LoggerStream() {
35
75
36
76
std::ostringstream message;
37
77
78
+ #if _WIN32
79
+ if (useColor)
80
+ setWindowsColor (getColor (messageLogLevel));
81
+ #else
82
+ if (useColor)
83
+ message << getColor (messageLogLevel);
84
+ #endif
85
+
38
86
if (showTimestamp)
39
87
message << getTimestamp () << ' ' ;
40
88
41
89
message << logLevelToString (messageLogLevel) << ' ' << strStream.str () << std::endl;
42
90
43
- if (messageLogLevel == LogLevel::FATAL || messageLogLevel == LogLevel::ERROR) {
91
+ #if not _WIN32
92
+ if (useColor)
93
+ message << " \033 [0m" ;
94
+ #endif
95
+
96
+ if (messageLogLevel == LogLevel::Fatal) {
97
+ std::cerr << message.str ();
98
+ std::exit (EXIT_FAILURE);
99
+ } else if (messageLogLevel == LogLevel::Error) {
44
100
std::cerr << message.str ();
45
101
} else {
46
102
std::cout << message.str ();
47
103
}
104
+
105
+ #if _WIN32
106
+ if (useColor)
107
+ setWindowsColor (0x0F );
108
+ #endif
48
109
}
49
110
50
111
Logger::LoggerStream Logger::log (const LogLevel level) {
0 commit comments