This commit is contained in:
2025-10-06 04:18:49 +08:00
commit df2cacdb92
2784 changed files with 1280840 additions and 0 deletions

110
source/Tool/Logger.cpp Normal file
View File

@@ -0,0 +1,110 @@
#include "Logger.h"
Logger::Logger()
: m_logFile(nullptr)
, m_initialized(false)
, m_originalCallback(nullptr)
, m_originalUserdata(nullptr)
{
}
Logger::~Logger()
{
Close();
}
bool Logger::Init()
{
if (m_initialized) {
return true;
}
// 获取当前工作目录
char cwd[1024];
if (getcwd(cwd, sizeof(cwd)) == nullptr) {
return false;
}
// 构建日志文件路径
std::string logPath = std::string(cwd) + "/log.txt";
// 打开日志文件(追加模式)
m_logFile = fopen(logPath.c_str(), "a");
if (!m_logFile) {
return false;
}
// 保存原始的SDL日志回调
SDL_LogGetOutputFunction(&m_originalCallback, &m_originalUserdata);
// 设置自定义的SDL日志回调
SDL_LogSetOutputFunction(SDLLogCallback, this);
m_initialized = true;
// 使用SDL_Log写入初始化信息这会同时输出到文件和原始目标
SDL_Log("Logger initialized successfully - Log file: %s", logPath.c_str());
return true;
}
void Logger::Close()
{
if (m_initialized) {
if (m_logFile) {
SDL_Log("Logger shutting down");
fflush(m_logFile);
fclose(m_logFile);
m_logFile = nullptr;
}
// 恢复原始的SDL日志回调
if (m_originalCallback) {
SDL_LogSetOutputFunction(m_originalCallback, m_originalUserdata);
}
m_initialized = false;
}
}
void Logger::SDLLogCallback(void* userdata, int category, SDL_LogPriority priority, const char* message)
{
Logger* logger = static_cast<Logger*>(userdata);
// 首先调用原始回调(保持控制台输出等功能)
if (logger->m_originalCallback) {
logger->m_originalCallback(logger->m_originalUserdata, category, priority, message);
}
// 然后写入到日志文件
if (logger->m_initialized && logger->m_logFile) {
std::string timestamp = logger->GetCurrentTime();
const char* priorityStr = "UNKNOWN";
switch (priority) {
case SDL_LOG_PRIORITY_VERBOSE: priorityStr = "VERBOSE"; break;
case SDL_LOG_PRIORITY_DEBUG: priorityStr = "DEBUG"; break;
case SDL_LOG_PRIORITY_INFO: priorityStr = "INFO"; break;
case SDL_LOG_PRIORITY_WARN: priorityStr = "WARN"; break;
case SDL_LOG_PRIORITY_ERROR: priorityStr = "ERROR"; break;
case SDL_LOG_PRIORITY_CRITICAL: priorityStr = "CRITICAL"; break;
default: break;
}
fprintf(logger->m_logFile, "[%s][%s] %s\n", timestamp.c_str(), priorityStr, message);
fflush(logger->m_logFile);
}
}
std::string Logger::GetCurrentTime()
{
time_t rawTime;
struct tm* timeInfo;
char buffer[80];
time(&rawTime);
timeInfo = localtime(&rawTime);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeInfo);
return std::string(buffer);
}