mirror of
https://github.com/LHY0125/PathEditor.git
synced 2026-05-10 02:09:46 +08:00
feat: 新增安全字符串处理和日志系统模块
- 添加 safe_string 模块,提供安全的字符串复制、拼接和复制功能 - 添加 logger 模块,支持多级别日志记录和文件输出 - 添加 error_code 模块,定义统一的错误代码枚举 - 添加 layout_config 模块,定义布局配置结构 - 更新 CMakeLists.txt 包含新增的源文件
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
#include "utils/logger.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
|
||||
// 全局日志文件指针
|
||||
static FILE *G_log_file = NULL;
|
||||
// 全局日志级别
|
||||
static LogLevel G_log_level = LOG_LEVEL_INFO;
|
||||
|
||||
// 将日志级别转换为字符串
|
||||
static const char *level_to_string(LogLevel level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case LOG_LEVEL_DEBUG:
|
||||
return "DEBUG";
|
||||
case LOG_LEVEL_INFO:
|
||||
return "INFO ";
|
||||
case LOG_LEVEL_WARN:
|
||||
return "WARN ";
|
||||
case LOG_LEVEL_ERROR:
|
||||
return "ERROR";
|
||||
default:
|
||||
return "UNKN ";
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前时间戳
|
||||
static void get_timestamp(char *buffer, size_t size)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
struct tm *tm_info = localtime(&now);
|
||||
strftime(buffer, size, "%Y-%m-%d %H:%M:%S", tm_info);
|
||||
}
|
||||
|
||||
// 写入日志
|
||||
static void log_write(LogLevel level, const char *fmt, va_list args)
|
||||
{
|
||||
if (level < G_log_level)
|
||||
return;
|
||||
|
||||
char timestamp[64];
|
||||
get_timestamp(timestamp, sizeof(timestamp));
|
||||
|
||||
char message[1024];
|
||||
vsnprintf(message, sizeof(message), fmt, args);
|
||||
|
||||
const char *level_str = level_to_string(level);
|
||||
|
||||
if (G_log_file)
|
||||
{
|
||||
fprintf(G_log_file, "[%s] [%s] %s\n", timestamp, level_str, message);
|
||||
fflush(G_log_file);
|
||||
}
|
||||
|
||||
fprintf(stdout, "[%s] [%s] %s\n", timestamp, level_str, message);
|
||||
}
|
||||
|
||||
// 初始化日志系统
|
||||
void log_init(const char *log_file, LogLevel level)
|
||||
{
|
||||
if (log_file)
|
||||
{
|
||||
G_log_file = fopen(log_file, "a");
|
||||
if (!G_log_file)
|
||||
{
|
||||
fprintf(stderr, "Failed to open log file: %s\n", log_file);
|
||||
}
|
||||
}
|
||||
G_log_level = level;
|
||||
}
|
||||
|
||||
// 销毁日志系统
|
||||
void log_destroy(void)
|
||||
{
|
||||
if (G_log_file)
|
||||
{
|
||||
fclose(G_log_file);
|
||||
G_log_file = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// 设置日志级别
|
||||
void log_set_level(LogLevel level)
|
||||
{
|
||||
G_log_level = level;
|
||||
}
|
||||
|
||||
// 调试日志
|
||||
void log_debug(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
log_write(LOG_LEVEL_DEBUG, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
// 信息日志
|
||||
void log_info(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
log_write(LOG_LEVEL_INFO, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
// 警告日志
|
||||
void log_warn(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
log_write(LOG_LEVEL_WARN, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
// 错误日志
|
||||
void log_error(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
log_write(LOG_LEVEL_ERROR, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
Reference in New Issue
Block a user