Files
DNF_DEV/source/Tool/Logger.cpp
2025-10-06 04:18:49 +08:00

110 lines
2.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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);
}