88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
#include "logger.hpp"
|
|
#include <iostream>
|
|
|
|
namespace custom {
|
|
|
|
Logger& Logger::getInstance() {
|
|
static Logger instance;
|
|
return instance;
|
|
}
|
|
|
|
void Logger::setLevel(LogLevel level) {
|
|
std::lock_guard<std::mutex> lock(logMutex_);
|
|
currentLevel_ = level;
|
|
}
|
|
|
|
void Logger::setLogFile(const std::string& filename) {
|
|
std::lock_guard<std::mutex> lock(logMutex_);
|
|
if (logFile_) {
|
|
logFile_->close();
|
|
}
|
|
logFile_ = std::make_unique<std::ofstream>(filename, std::ios::app);
|
|
if (!logFile_->is_open()) {
|
|
std::cerr << "Failed to open log file: " << filename << std::endl;
|
|
logFile_.reset();
|
|
}
|
|
}
|
|
|
|
void Logger::log(LogLevel level, const std::string& message) {
|
|
if (level < currentLevel_) {
|
|
return;
|
|
}
|
|
|
|
std::lock_guard<std::mutex> lock(logMutex_);
|
|
std::string timestamp = getCurrentTime();
|
|
std::string levelStr = levelToString(level);
|
|
|
|
std::string logMessage = "[" + timestamp + "] [" + levelStr + "] " + message;
|
|
|
|
// Always log to console
|
|
std::cout << logMessage << std::endl;
|
|
|
|
// Log to file if available
|
|
if (logFile_ && logFile_->is_open()) {
|
|
*logFile_ << logMessage << std::endl;
|
|
logFile_->flush();
|
|
}
|
|
}
|
|
|
|
void Logger::debug(const std::string& message) {
|
|
log(LogLevel::DEBUG, message);
|
|
}
|
|
|
|
void Logger::info(const std::string& message) {
|
|
log(LogLevel::INFO, message);
|
|
}
|
|
|
|
void Logger::warn(const std::string& message) {
|
|
log(LogLevel::WARN, message);
|
|
}
|
|
|
|
void Logger::error(const std::string& message) {
|
|
log(LogLevel::ERROR, message);
|
|
}
|
|
|
|
std::string Logger::getCurrentTime() {
|
|
auto now = std::chrono::system_clock::now();
|
|
auto time_t = std::chrono::system_clock::to_time_t(now);
|
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
now.time_since_epoch()) % 1000;
|
|
|
|
std::stringstream ss;
|
|
ss << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S");
|
|
ss << "." << std::setfill('0') << std::setw(3) << ms.count();
|
|
return ss.str();
|
|
}
|
|
|
|
std::string Logger::levelToString(LogLevel level) {
|
|
switch (level) {
|
|
case LogLevel::DEBUG: return "DEBUG";
|
|
case LogLevel::INFO: return "INFO ";
|
|
case LogLevel::WARN: return "WARN ";
|
|
case LogLevel::ERROR: return "ERROR";
|
|
default: return "UNKNOWN";
|
|
}
|
|
}
|
|
|
|
} // namespace custom
|