Add initial project structure with CMake configuration, source files, and README documentation for Unitree GO2 Custom Controller
This commit is contained in:
87
src/logger.cpp
Normal file
87
src/logger.cpp
Normal file
@@ -0,0 +1,87 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user