Cogs.Core
ConsoleLogger.cpp
1#include "ConsoleLogger.h"
2
3#include "../Platform/DebugUtils.h"
4
5#include <algorithm>
6#include <cstdio>
7
8namespace
9{
10 Cogs::Logging::ConsoleLogger* inst = nullptr;
11}
12
13Cogs::Logging::ConsoleLogger::ConsoleLogger() {
14 assert(!inst);
15 inst = this;
16#if defined( __APPLE__ )
17 use_color = !isBeingDebugged();
18#endif
19}
20
21Cogs::Logging::ConsoleLogger::~ConsoleLogger() {
22 assert(inst == this);
23 inst = nullptr;
24}
25
26Cogs::Logging::ConsoleLogger& Cogs::Logging::ConsoleLogger::instance() {
27 if (!inst) {
28 new ConsoleLogger;
29 }
30 return *inst;
31}
32
33void Cogs::Logging::ConsoleLogger::outputMessage(const std::string& prefix, const Message& message) {
34 thread_local static char buffer[500] = {};
35 const char *cat = use_color ? getCategoryNameColor(message.category) : getCategoryName(message.category);
36 int n = 0;
37 if(outputFilenames && message.file) {
38 n = std::snprintf(buffer, sizeof(buffer) - 1, "[%s][%s][%s:%d]%s ", cat, message.source.c_str(), message.file, message.line, prefix.c_str());
39 }
40 else {
41 n = std::snprintf(buffer, sizeof(buffer) - 1, "[%s][%s]%s ", cat, message.source.c_str(), prefix.c_str());
42 }
43
44 // Guard against overflow if very long prefix generated. Format error < 0 not probable.
45 n = std::max(n, 0);
46 n = std::min(n, int(sizeof(buffer)));
47
48 LockGuard lock(mutex);
49
50 std::fwrite(buffer, 1, n, stderr);
51 std::fwrite(message.message.c_str(), 1, message.message.size(), stderr);
52 std::fwrite("\n", 1, 1, stderr);
53}
Console logger that supports splitting log lines between stdout and stderr according to severity.
Definition: ConsoleLogger.h:16
COGSFOUNDATION_API bool isBeingDebugged()
Return true if the application is running under a debugger.