Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
AppenderConsole.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "AppenderConsole.h"
7#include "Config.h"
8#include "Util.h"
9
10#if PLATFORM == PLATFORM_WINDOWS
11#include <Windows.h>
12#endif
13
14#include <sstream>
15
22
23void AppenderConsole::InitColors(std::string const& str)
24{
25 if (str.empty())
26 {
27 _colored = false;
28 return;
29 }
30
31 int color[MaxLogLevels];
32
33 std::istringstream ss(str);
34
35 for (uint8 i = 0; i < MaxLogLevels; ++i)
36 {
37 ss >> color[i];
38
39 if (!ss)
40 return;
41
42 if (color[i] < 0 || color[i] >= MaxColors)
43 return;
44 }
45
46 for (uint8 i = 0; i < MaxLogLevels; ++i)
47 _colors[i] = ColorTypes(color[i]);
48
49 _colored = true;
50}
51
52void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color)
53{
54#if PLATFORM == PLATFORM_WINDOWS
55 static WORD WinColorFG[MaxColors] =
56 {
57 0, // BLACK
58 FOREGROUND_RED, // RED
59 FOREGROUND_GREEN, // GREEN
60 FOREGROUND_RED | FOREGROUND_GREEN, // BROWN
61 FOREGROUND_BLUE, // BLUE
62 FOREGROUND_RED | FOREGROUND_BLUE, // MAGENTA
63 FOREGROUND_GREEN | FOREGROUND_BLUE, // CYAN
64 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, // WHITE
65 // YELLOW
66FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
67// RED_BOLD
68FOREGROUND_RED | FOREGROUND_INTENSITY,
69// GREEN_BOLD
70FOREGROUND_GREEN | FOREGROUND_INTENSITY,
71FOREGROUND_BLUE | FOREGROUND_INTENSITY, // BLUE_BOLD
72// MAGENTA_BOLD
73FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
74// CYAN_BOLD
75FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
76// WHITE_BOLD
77FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
78 };
79
80 HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);
81 SetConsoleTextAttribute(hConsole, WinColorFG[color]);
82#else
83 enum ANSITextAttr
84 {
85 TA_NORMAL = 0,
86 TA_BOLD = 1,
87 TA_BLINK = 5,
88 TA_REVERSE = 7
89 };
90
91 enum ANSIFgTextAttr
92 {
93 FG_BLACK = 30,
94 FG_RED,
95 FG_GREEN,
96 FG_BROWN,
97 FG_BLUE,
98 FG_MAGENTA,
99 FG_CYAN,
100 FG_WHITE,
101 FG_YELLOW
102 };
103
104 enum ANSIBgTextAttr
105 {
106 BG_BLACK = 40,
107 BG_RED,
108 BG_GREEN,
109 BG_BROWN,
110 BG_BLUE,
111 BG_MAGENTA,
112 BG_CYAN,
113 BG_WHITE
114 };
115
116 static uint8 UnixColorFG[MaxColors] =
117 {
118 FG_BLACK, // BLACK
119 FG_RED, // RED
120 FG_GREEN, // GREEN
121 FG_BROWN, // BROWN
122 FG_BLUE, // BLUE
123 FG_MAGENTA, // MAGENTA
124 FG_CYAN, // CYAN
125 FG_WHITE, // WHITE
126 FG_YELLOW, // YELLOW
127 FG_RED, // LRED
128 FG_GREEN, // LGREEN
129 FG_BLUE, // LBLUE
130 FG_MAGENTA, // LMAGENTA
131 FG_CYAN, // LCYAN
132 FG_WHITE // LWHITE
133 };
134
135 fprintf((stdout_stream ? stdout : stderr), "\x1b[%d%sm", UnixColorFG[color], (color >= YELLOW && color < MaxColors ? ";1" : ""));
136#endif
137}
138
139void AppenderConsole::ResetColor(bool stdout_stream)
140{
141#if PLATFORM == PLATFORM_WINDOWS
142 HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);
143 SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
144#else
145 fprintf((stdout_stream ? stdout : stderr), "\x1b[0m");
146#endif
147}
148
150{
151 bool stdout_stream = !(message.level == LogLevel::LOG_LEVEL_ERROR || message.level == LogLevel::LOG_LEVEL_FATAL);
152
153 if (_colored)
154 {
155 uint8 index;
156 switch (message.level)
157 {
159 index = 5;
160 break;
162 index = 4;
163 break;
165 index = 3;
166 break;
168 index = 2;
169 break;
171 index = 0;
172 break;
173 case LogLevel::LOG_LEVEL_ERROR: // No break on purpose
174 default:
175 index = 1;
176 break;
177 }
178
179 SetColor(stdout_stream, _colors[index]);
180 utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
181 ResetColor(stdout_stream);
182 }
183 else
184 utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
185}
AppenderType
Definition Appender.h:29
@ APPENDER_CONSOLE
Definition Appender.h:31
AppenderFlags
Definition Appender.h:37
const uint8 MaxLogLevels
Definition Appender.h:26
LogLevel
Definition Appender.h:16
@ LOG_LEVEL_TRACE
Definition Appender.h:18
@ LOG_LEVEL_WARN
Definition Appender.h:21
@ LOG_LEVEL_ERROR
Definition Appender.h:22
@ LOG_LEVEL_INFO
Definition Appender.h:20
@ LOG_LEVEL_FATAL
Definition Appender.h:23
@ LOG_LEVEL_DEBUG
Definition Appender.h:19
ColorTypes
@ YELLOW
const uint8 MaxColors
std::uint8_t uint8
Definition Define.h:79
void utf8printf(FILE *out, const char *str,...)
Definition Util.cpp:489
AppenderConsole(uint8 _id, std::string const &name, LogLevel level, AppenderFlags flags)
void ResetColor(bool stdout_stream)
ColorTypes _colors[MaxLogLevels]
void _write(LogMessage const &message)
void SetColor(bool stdout_stream, ColorTypes color)
void InitColors(const std::string &init_str)
std::string name
Definition Appender.h:89
uint8 id
Definition Appender.h:88
LogLevel level
Definition Appender.h:91
AppenderFlags flags
Definition Appender.h:92
Appender(uint8 _id, std::string const &name, AppenderType type=AppenderType::APPENDER_NONE, LogLevel level=LogLevel::LOG_LEVEL_DISABLED, AppenderFlags flags=APPENDER_FLAGS_NONE)
Definition Appender.cpp:24
LogLevel level
Definition Appender.h:55
std::string text
Definition Appender.h:57
std::string prefix
Definition Appender.h:58