1#ifndef CONSOLELOGGER_HPP
2#define CONSOLELOGGER_HPP
30 std::ofstream logFile_;
31 bool addNewLine_ =
true;
32 std::string appPrefix_;
44 bool colorEnabled_ =
true;
45 bool autoDetectColor_ =
true;
50 std::lock_guard<std::mutex> lock(logMutex_);
51 if (logFile_.is_open()) {
59 : logFile_(std::move(other.logFile_)), addNewLine_(other.addNewLine_),
60 appPrefix_(std::move(other.appPrefix_)), currentLevel_(other.currentLevel_),
61 colorEnabled_(other.colorEnabled_), autoDetectColor_(other.autoDetectColor_) {}
66 std::lock(logMutex_, other.logMutex_);
67 std::lock_guard<std::mutex> lock1(logMutex_, std::adopt_lock);
68 std::lock_guard<std::mutex> lock2(other.logMutex_, std::adopt_lock);
70 logFile_ = std::move(other.logFile_);
71 addNewLine_ = other.addNewLine_;
72 appPrefix_ = std::move(other.appPrefix_);
73 currentLevel_ = other.currentLevel_;
74 colorEnabled_ = other.colorEnabled_;
75 autoDetectColor_ = other.autoDetectColor_;
80 void debug(
const std::string &message,
const std::string &caller =
"")
override {
84 void info(
const std::string &message,
const std::string &caller =
"")
override {
88 void warning(
const std::string &message,
const std::string &caller =
"")
override {
92 void error(
const std::string &message,
const std::string &caller =
"")
override {
96 void critical(
const std::string &message,
const std::string &caller =
"")
override {
108 const std::string &caller) {
109 std::lock_guard<std::mutex> lock(logMutex_);
112 auto now = std::chrono::system_clock::now();
113 std::time_t now_c = std::chrono::system_clock::to_time_t(now);
118 localtime_s(&now_tm, &now_c);
120 localtime_r(&now_c, &now_tm);
124 std::ostringstream header;
125 if (!appPrefix_.empty()) {
126 header <<
"[" << appPrefix_ <<
"]";
128 header <<
"[" << std::put_time(&now_tm,
"%Y-%m-%d %H:%M:%S") <<
"]";
130 if (!caller.empty()) {
131 header <<
"[" << caller <<
"]";
136 if (shouldUseColors()) {
139 std::cout << header.str() << message;
144 if (shouldUseColors()) {
149 if (logFile_.is_open()) {
150 logFile_ << header.str() << message;
158 std::lock_guard<std::mutex> lock(logMutex_);
159 currentLevel_ = level;
164 return currentLevel_;
168 std::lock_guard<std::mutex> lock(logMutex_);
178 std::lock_guard<std::mutex> lock(logMutex_);
180 logFile_.open(filename, std::ios::out | std::ios::app);
181 return logFile_.is_open();
182 }
catch (
const std::ios_base::failure &e) {
183 std::cerr <<
"Failed to open log file: " << filename <<
" - " << e.what() <<
"\n";
185 }
catch (
const std::exception &e) {
186 std::cerr <<
"Failed to open log file: " << filename <<
" - " << e.what() <<
"\n";
189 std::cerr <<
"Failed to open log file: " << filename <<
"\n";
195 std::lock_guard<std::mutex> lock(logMutex_);
196 if (logFile_.is_open()) {
214 default:
return "INF";
224 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
225 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
226#elif defined(__EMSCRIPTEN__)
229 std::cout <<
"\033[0m";
235 const std::map<dotnamecpp::logging::Level, WORD> colorMap = {
237 FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY},
240 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY},
243 FOREGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_BLUE }};
244 auto it = colorMap.find(level);
245 if (it != colorMap.end()) {
246 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), it->second);
253 static const std::map<dotnamecpp::logging::Level, const char *> colorMap = {
259 auto it = colorMap.find(level);
260 if (it != colorMap.end()) {
261 std::cout << it->second;
270 setConsoleColorWindows(level);
279 std::string headerName_ =
"DotNameLib";
280 bool includeName_ =
true;
281 bool includeTime_ =
true;
282 bool includeCaller_ =
true;
283 bool includeLevel_ =
true;
295 const std::string &message,
const std::string &caller,
const std::tm &now_tm) {
297 stream << buildHeader(now_tm, caller, level) << message;
314 std::string buildHeader(
const std::tm &now_tm,
const std::string &caller,
316 std::ostringstream header;
318 header <<
"[" << headerName_ <<
"] ";
321 header <<
"[" << std::put_time(&now_tm,
"%d-%m-%Y %H:%M:%S") <<
"] ";
323 if (includeCaller_ && !caller.empty()) {
324 header <<
"[" << caller <<
"] ";
339 std::lock_guard<std::mutex> lock(logMutex_);
340 headerName_ = headerName;
349 std::lock_guard<std::mutex> lock(logMutex_);
350 includeName_ = includeName;
359 std::lock_guard<std::mutex> lock(logMutex_);
360 includeTime_ = includeTime;
369 std::lock_guard<std::mutex> lock(logMutex_);
370 includeCaller_ = includeCaller;
379 std::lock_guard<std::mutex> lock(logMutex_);
380 includeLevel_ = includeLevel;
423 std::lock_guard<std::mutex> lock(logMutex_);
424 colorEnabled_ = enabled;
425 autoDetectColor_ =
false;
434 std::lock_guard<std::mutex> lock(logMutex_);
435 autoDetectColor_ = autoDetect;
444 bool shouldUseColors()
const {
445 if (!autoDetectColor_) {
446 return colorEnabled_;
452 return colorEnabled_ && (isatty(fileno(stdout)) != 0);
void showHeaderTime(bool includeTime)
Show or hide the header time in the log output.
Definition ConsoleLogger.hpp:358
ConsoleLogger & operator=(ConsoleLogger &&other) noexcept
Definition ConsoleLogger.hpp:63
dotnamecpp::logging::Level getLevel() const override
Get the Level object.
Definition ConsoleLogger.hpp:163
~ConsoleLogger()
Definition ConsoleLogger.hpp:49
void setLevel(dotnamecpp::logging::Level level) override
Set the Level object.
Definition ConsoleLogger.hpp:157
void setAppPrefix(const std::string &prefix) override
Set the application prefix for log messages.
Definition ConsoleLogger.hpp:167
static std::string levelToString(dotnamecpp::logging::Level level)
Convert a logging level to its string representation.
Definition ConsoleLogger.hpp:207
void showHeaderName(bool includeName)
Show or hide the header name in the log output.
Definition ConsoleLogger.hpp:348
void noHeader(bool noHeader)
Show or hide all headers in the log output.
Definition ConsoleLogger.hpp:388
static void resetConsoleColor()
Reset the console color to default.
Definition ConsoleLogger.hpp:222
void warning(const std::string &message, const std::string &caller="") override
Log a warning message.
Definition ConsoleLogger.hpp:88
static void setConsoleColorUnix(dotnamecpp::logging::Level level)
Definition ConsoleLogger.hpp:252
ConsoleLogger(ConsoleLogger &&other) noexcept
Definition ConsoleLogger.hpp:58
void debug(const std::string &message, const std::string &caller="") override
Log a debug message.
Definition ConsoleLogger.hpp:80
void error(const std::string &message, const std::string &caller="") override
Log an error message.
Definition ConsoleLogger.hpp:92
ConsoleLogger & operator=(const ConsoleLogger &)=delete
void disableFileLogging() override
Disable logging to a file.
Definition ConsoleLogger.hpp:194
void showHeaderLevel(bool includeLevel)
Show or hide the header level in the log output.
Definition ConsoleLogger.hpp:378
std::string getAppPrefix() const override
Get the App Prefix object.
Definition ConsoleLogger.hpp:173
void log(dotnamecpp::logging::Level level, const std::string &message, const std::string &caller)
Logs a message with a specified level to the console and optionally to a file.
Definition ConsoleLogger.hpp:107
void info(const std::string &message, const std::string &caller="") override
Log an info message.
Definition ConsoleLogger.hpp:84
bool enableFileLogging(const std::string &filename) override
Enable logging to a file.
Definition ConsoleLogger.hpp:177
void showHeaderCaller(bool includeCaller)
Show or hide the header caller in the log output.
Definition ConsoleLogger.hpp:368
void setHeaderName(const std::string &headerName)
Set the Header Name object.
Definition ConsoleLogger.hpp:338
void critical(const std::string &message, const std::string &caller="") override
Log a critical message.
Definition ConsoleLogger.hpp:96
void setAutoDetectColor(bool autoDetect)
Enable automatic color detection based on TTY.
Definition ConsoleLogger.hpp:433
void visibleHeaders(bool incName, bool incTime, bool incCaller, bool incLevel)
Show or hide specific headers in the log output.
Definition ConsoleLogger.hpp:410
void setColorEnabled(bool enabled)
Enable or disable colored output.
Definition ConsoleLogger.hpp:422
static void setConsoleColor(dotnamecpp::logging::Level level)
Definition ConsoleLogger.hpp:268
ConsoleLogger(const ConsoleLogger &)=delete
Definition ILogger.hpp:69
LogStream stream(Level level, const std::string &caller="")
Create a LogStream for streaming log messages.
Definition ILogger.hpp:165
Level
Logging levels.
Definition ILogger.hpp:21
@ LOG_CRITICAL
Definition ILogger.hpp:21
@ LOG_INFO
Definition ILogger.hpp:21
@ LOG_ERROR
Definition ILogger.hpp:21
@ LOG_WARNING
Definition ILogger.hpp:21
@ LOG_DEBUG
Definition ILogger.hpp:21