116 void announce(LogLevel level, Emitter source, std::string_view message,
117 std::source_location location = std::source_location::current())
119 if (level < m_min_level)
122 std::lock_guard lock(m_mutex);
124 auto use_color = [
this](std::string_view color_code) {
125 return m_colors_enabled ? color_code :
"";
130 std::cout << use_color(Colors::BrightBlue)
132 << use_color(Colors::Reset);
134 std::cout << use_color(level_color(level))
135 <<
"|" << level_string(level) <<
"| "
136 << use_color(Colors::Reset);
138 std::cout << use_color(Colors::Cyan)
139 << emitter_string(source) <<
" → "
140 << use_color(Colors::Reset);
142 std::cout << message;
144 if (m_verbose || level >= LogLevel::ERROR) {
145 if (location.file_name() !=
nullptr) {
146 std::cout << use_color(Colors::BrightBlue)
147 <<
" (" << extract_filename(location.file_name())
148 <<
":" << location.line() <<
")"
149 << use_color(Colors::Reset);
162 void trace(Emitter source, std::string_view message,
163 std::source_location location = std::source_location::current())
165 announce(LogLevel::TRACE, source, message, location);
174 void debug(Emitter source, std::string_view message,
175 std::source_location location = std::source_location::current())
177 announce(LogLevel::DEBUG, source, message, location);
186 void info(Emitter source, std::string_view message,
187 std::source_location location = std::source_location::current())
189 announce(LogLevel::INFO, source, message, location);
198 void warn(Emitter source, std::string_view message,
199 std::source_location location = std::source_location::current())
201 announce(LogLevel::WARN, source, message, location);
210 void error(Emitter source, std::string_view message,
211 std::source_location location = std::source_location::current())
213 announce(LogLevel::ERROR, source, message, location);
222 void fatal(Emitter source, std::string_view message,
223 std::source_location location = std::source_location::current())
225 announce(LogLevel::FATAL, source, message, location);
250 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
251 if (hOut == INVALID_HANDLE_VALUE) {
256 if (!GetConsoleMode(hOut, &dwMode)) {
260 dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
261 if (!SetConsoleMode(hOut, dwMode)) {