Files
PathEditor/src/utils/logger.c
T
Serendipity d934d21323 feat: 新增安全字符串处理和日志系统模块
- 添加 safe_string 模块,提供安全的字符串复制、拼接和复制功能
- 添加 logger 模块,支持多级别日志记录和文件输出
- 添加 error_code 模块,定义统一的错误代码枚举
- 添加 layout_config 模块,定义布局配置结构
- 更新 CMakeLists.txt 包含新增的源文件
2026-03-26 12:47:44 +08:00

126 lines
2.5 KiB
C

#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);
}