2026-02-02 12:24:50 -08:00
|
|
|
#include "core/logger.hpp"
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
#include <ctime>
|
2026-02-05 21:03:27 -08:00
|
|
|
#include <filesystem>
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
namespace wowee {
|
|
|
|
|
namespace core {
|
|
|
|
|
|
|
|
|
|
Logger& Logger::getInstance() {
|
|
|
|
|
static Logger instance;
|
|
|
|
|
return instance;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 21:03:27 -08:00
|
|
|
void Logger::ensureFile() {
|
|
|
|
|
if (fileReady) return;
|
|
|
|
|
fileReady = true;
|
|
|
|
|
std::error_code ec;
|
|
|
|
|
std::filesystem::create_directories("logs", ec);
|
2026-02-06 14:49:53 -08:00
|
|
|
fileStream.open("logs/wowee.log", std::ios::out | std::ios::trunc);
|
2026-02-05 21:03:27 -08:00
|
|
|
}
|
|
|
|
|
|
2026-02-02 12:24:50 -08:00
|
|
|
void Logger::log(LogLevel level, const std::string& message) {
|
|
|
|
|
if (level < minLevel) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(mutex);
|
2026-02-05 21:03:27 -08:00
|
|
|
ensureFile();
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
// Get current time
|
|
|
|
|
auto now = std::chrono::system_clock::now();
|
|
|
|
|
auto time = std::chrono::system_clock::to_time_t(now);
|
|
|
|
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
|
|
|
now.time_since_epoch()) % 1000;
|
|
|
|
|
|
|
|
|
|
std::tm tm;
|
|
|
|
|
localtime_r(&time, &tm);
|
|
|
|
|
|
|
|
|
|
// Format: [YYYY-MM-DD HH:MM:SS.mmm] [LEVEL] message
|
2026-02-05 21:03:27 -08:00
|
|
|
std::ostringstream line;
|
|
|
|
|
line << "["
|
|
|
|
|
<< std::put_time(&tm, "%Y-%m-%d %H:%M:%S")
|
|
|
|
|
<< "." << std::setfill('0') << std::setw(3) << ms.count()
|
|
|
|
|
<< "] [";
|
2026-02-02 12:24:50 -08:00
|
|
|
|
|
|
|
|
switch (level) {
|
2026-02-05 21:03:27 -08:00
|
|
|
case LogLevel::DEBUG: line << "DEBUG"; break;
|
|
|
|
|
case LogLevel::INFO: line << "INFO "; break;
|
|
|
|
|
case LogLevel::WARNING: line << "WARN "; break;
|
|
|
|
|
case LogLevel::ERROR: line << "ERROR"; break;
|
|
|
|
|
case LogLevel::FATAL: line << "FATAL"; break;
|
2026-02-02 12:24:50 -08:00
|
|
|
}
|
|
|
|
|
|
2026-02-05 21:03:27 -08:00
|
|
|
line << "] " << message;
|
|
|
|
|
|
|
|
|
|
std::cout << line.str() << std::endl;
|
|
|
|
|
if (fileStream.is_open()) {
|
|
|
|
|
fileStream << line.str() << std::endl;
|
|
|
|
|
fileStream.flush();
|
|
|
|
|
}
|
2026-02-02 12:24:50 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Logger::setLogLevel(LogLevel level) {
|
|
|
|
|
minLevel = level;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace core
|
|
|
|
|
} // namespace wowee
|