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;
159 std::lock_guard<std::mutex> lock(logMutex_);
160 currentLevel_ = level;
165 return currentLevel_;
169 std::lock_guard<std::mutex> lock(logMutex_);
179 std::lock_guard<std::mutex> lock(logMutex_);
181 logFile_.open(filename, std::ios::out | std::ios::app);
182 return logFile_.is_open();
183 }
catch (
const std::ios_base::failure &e) {
184 std::cerr <<
"Failed to open log file: " << filename <<
" - " << e.what() <<
"\n";
186 }
catch (
const std::exception &e) {
187 std::cerr <<
"Failed to open log file: " << filename <<
" - " << e.what() <<
"\n";
190 std::cerr <<
"Failed to open log file: " << filename <<
"\n";
196 std::lock_guard<std::mutex> lock(logMutex_);
197 if (logFile_.is_open()) {
215 default:
return "INF";
225 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
226 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
227#elif defined(__EMSCRIPTEN__)
230 std::cout <<
"\033[0m";
236 const std::map<dotnamecpp::logging::Level, WORD> colorMap = {
238 FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY},
241 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY},
244 FOREGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_BLUE }};
245 auto it = colorMap.find(level);
246 if (it != colorMap.end()) {
247 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), it->second);
254 static const std::map<dotnamecpp::logging::Level, const char *> colorMap = {
260 auto it = colorMap.find(level);
261 if (it != colorMap.end()) {
262 std::cout << it->second;
271 setConsoleColorWindows(level);
280 std::string headerName_ =
"DotNameLib";
281 bool includeName_ =
true;
282 bool includeTime_ =
true;
283 bool includeCaller_ =
true;
284 bool includeLevel_ =
true;
296 const std::string &message,
const std::string &caller,
const std::tm &now_tm) {
298 stream << buildHeader(now_tm, caller, level) << message;
315 std::string buildHeader(
const std::tm &now_tm,
const std::string &caller,
317 std::ostringstream header;
319 header <<
"[" << headerName_ <<
"] ";
322 header <<
"[" << std::put_time(&now_tm,
"%d-%m-%Y %H:%M:%S") <<
"] ";
324 if (includeCaller_ && !caller.empty()) {
325 header <<
"[" << caller <<
"] ";
340 std::lock_guard<std::mutex> lock(logMutex_);
341 headerName_ = headerName;
350 std::lock_guard<std::mutex> lock(logMutex_);
351 includeName_ = includeName;
360 std::lock_guard<std::mutex> lock(logMutex_);
361 includeTime_ = includeTime;
370 std::lock_guard<std::mutex> lock(logMutex_);
371 includeCaller_ = includeCaller;
380 std::lock_guard<std::mutex> lock(logMutex_);
381 includeLevel_ = includeLevel;
424 std::lock_guard<std::mutex> lock(logMutex_);
425 colorEnabled_ = enabled;
426 autoDetectColor_ =
false;
435 std::lock_guard<std::mutex> lock(logMutex_);
436 autoDetectColor_ = autoDetect;
445 bool shouldUseColors()
const {
446 if (!autoDetectColor_) {
447 return colorEnabled_;
453 return colorEnabled_ && (isatty(fileno(stdout)) != 0);
void showHeaderTime(bool includeTime)
Show or hide the header time in the log output.
Definition ConsoleLogger.hpp:359
ConsoleLogger & operator=(ConsoleLogger &&other) noexcept
Definition ConsoleLogger.hpp:63
dotnamecpp::logging::Level getLevel() const override
Get the Level object.
Definition ConsoleLogger.hpp:164
~ConsoleLogger()
Definition ConsoleLogger.hpp:49
void setLevel(dotnamecpp::logging::Level level) override
Set the Level object.
Definition ConsoleLogger.hpp:158
void setAppPrefix(const std::string &prefix) override
Set the application prefix for log messages.
Definition ConsoleLogger.hpp:168
static std::string levelToString(dotnamecpp::logging::Level level)
Convert a logging level to its string representation.
Definition ConsoleLogger.hpp:208
void showHeaderName(bool includeName)
Show or hide the header name in the log output.
Definition ConsoleLogger.hpp:349
void noHeader(bool noHeader)
Show or hide all headers in the log output.
Definition ConsoleLogger.hpp:389
static void resetConsoleColor()
Reset the console color to default.
Definition ConsoleLogger.hpp:223
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:253
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:195
void showHeaderLevel(bool includeLevel)
Show or hide the header level in the log output.
Definition ConsoleLogger.hpp:379
std::string getAppPrefix() const override
Get the App Prefix object.
Definition ConsoleLogger.hpp:174
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:178
void showHeaderCaller(bool includeCaller)
Show or hide the header caller in the log output.
Definition ConsoleLogger.hpp:369
void setHeaderName(const std::string &headerName)
Set the Header Name object.
Definition ConsoleLogger.hpp:339
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:434
void visibleHeaders(bool incName, bool incTime, bool incCaller, bool incLevel)
Show or hide specific headers in the log output.
Definition ConsoleLogger.hpp:411
void setColorEnabled(bool enabled)
Enable or disable colored output.
Definition ConsoleLogger.hpp:423
static void setConsoleColor(dotnamecpp::logging::Level level)
Definition ConsoleLogger.hpp:269
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