Skip to content

File emulator_logger.cpp

File List > common > src > emulator_logger.cpp

Go to the documentation of this file

#include "emulator_logger.hpp"
#include <ctime>
#include <iomanip>
#include <sstream>

namespace emulator {

Logger::~Logger() {
  if (m_file.is_open()) {
    m_file.close();
  }
}

void Logger::set_file(const std::string &filename) {
  if (m_file.is_open()) {
    m_file.close();
  }
  if (!filename.empty()) {
    m_file.open(filename, std::ios::out | std::ios::app);
  }
}

void Logger::log(LogLevel level, const std::string &message) {
  std::stringstream ss;
  ss << "[" << get_timestamp() << "] "
     << "[" << level_to_string(level) << "] " << message;

  if (m_file.is_open()) {
    m_file << ss.str() << std::endl;
  } else {
    std::cout << ss.str() << std::endl;
  }
}

void Logger::debug(const std::string &message) {
  log(LogLevel::DEBUG, message);
}

void Logger::verbose(const std::string &message) {
  log(LogLevel::VERBOSE, message);
}

void Logger::info(const std::string &message) { log(LogLevel::INFO, message); }

void Logger::warn(const std::string &message) {
  log(LogLevel::WARNING, message);
}

void Logger::error(const std::string &message) {
  log(LogLevel::ERROR, message);
}

std::string Logger::get_timestamp() {
  auto now = std::time(nullptr);
  auto tm = *std::localtime(&now);
  std::stringstream ss;
  ss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S");
  return ss.str();
}

std::string Logger::level_to_string(LogLevel level) {
  switch (level) {
  case LogLevel::DEBUG:
    return "DEBUG";
  case LogLevel::VERBOSE:
    return "VERBOSE";
  case LogLevel::INFO:
    return "INFO";
  case LogLevel::WARNING:
    return "WARNING";
  case LogLevel::ERROR:
    return "ERROR";
  default:
    return "UNKNOWN";
  }
}

} // namespace emulator