Skip to content

Commit 3cdb34d

Browse files
authored
Add colored text
2 parents 3146260 + b1eadf5 commit 3cdb34d

File tree

3 files changed

+87
-17
lines changed

3 files changed

+87
-17
lines changed

src/example/example.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#include "logger.hpp"
22

33
int main() {
4-
Logger::log(LogLevel::FATAL) << "Hello, Fatal!";
5-
Logger::log(LogLevel::ERROR) << "Hello, Error!";
6-
Logger::log(LogLevel::WARNING) << "Hello, Warning!";
7-
Logger::log(LogLevel::INFO) << "Hello, Info!";
4+
Logger::useColor = true;
5+
// Logger::log(LogLevel::FATAL) << "Hello, Fatal!";
6+
Logger::log(LogLevel::Error) << "Hello, Error!";
7+
Logger::log(LogLevel::Warning) << "Hello, Warning!";
8+
Logger::log(LogLevel::Info) << "Hello, Info!";
89
}

src/logger.cpp

+67-6
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@
44
#include <iostream>
55
#include <sstream>
66

7+
#if _WIN32
8+
9+
#include <windows.h>
10+
11+
#endif
12+
713
std::string Logger::logLevelToString(const LogLevel level) {
814
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]";
1319
default:
14-
log(LogLevel::ERROR) << "Invalid log level specified!";
20+
log(LogLevel::Error) << "Invalid log level specified!";
1521
return "\0";
1622
}
1723
}
@@ -26,6 +32,40 @@ std::string Logger::getTimestamp() {
2632
return '[' + currentTimeString + ']';
2733
}
2834

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+
2969
Logger::LoggerStream::LoggerStream(const LogLevel level)
3070
: messageLogLevel(level) {
3171
}
@@ -35,16 +75,37 @@ Logger::LoggerStream::~LoggerStream() {
3575

3676
std::ostringstream message;
3777

78+
#if _WIN32
79+
if (useColor)
80+
setWindowsColor(getColor(messageLogLevel));
81+
#else
82+
if (useColor)
83+
message << getColor(messageLogLevel);
84+
#endif
85+
3886
if (showTimestamp)
3987
message << getTimestamp() << ' ';
4088

4189
message << logLevelToString(messageLogLevel) << ' ' << strStream.str() << std::endl;
4290

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) {
44100
std::cerr << message.str();
45101
} else {
46102
std::cout << message.str();
47103
}
104+
105+
#if _WIN32
106+
if (useColor)
107+
setWindowsColor(0x0F);
108+
#endif
48109
}
49110

50111
Logger::LoggerStream Logger::log(const LogLevel level) {

src/logger.hpp

+15-7
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
namespace Logger {
66
enum class LogLevel {
7-
NONE = 0,
8-
FATAL = 1,
9-
ERROR = 2,
10-
WARNING = 4,
11-
INFO = 8,
12-
ALL = FATAL | ERROR | WARNING | INFO
7+
None = 0,
8+
Fatal = 1,
9+
Error = 2,
10+
Warning = 4,
11+
Info = 8,
12+
All = Fatal | Error | Warning | Info
1313
};
1414

1515
constexpr LogLevel operator|(LogLevel a, LogLevel b) {
@@ -28,12 +28,20 @@ namespace Logger {
2828
return static_cast<LogLevel>(~static_cast<char>(level));
2929
}
3030

31-
inline LogLevel logLevel = LogLevel::ALL;
31+
inline LogLevel logLevel = LogLevel::All;
3232
inline bool showTimestamp = true;
33+
inline bool useColor = false;
3334

3435
std::string logLevelToString(LogLevel level);
3536
std::string getTimestamp();
3637

38+
#if _WIN32
39+
int getColor(LogLevel level);
40+
void setWindowsColor(int color);
41+
#else
42+
std::string getColor(LogLevel level);
43+
#endif
44+
3745
class LoggerStream {
3846
public:
3947
explicit LoggerStream(LogLevel level);

0 commit comments

Comments
 (0)