cocoon/log.c
xfy911 9da9bd9449 docs: 为 config.c、log.c、tls.c 添加函数级 Doxygen 注释
- config.c: 为 JSON 解析器内部函数和公共 API 添加完整注释
- log.c: 为日志级别转换和输出函数添加注释
- tls.c: 为 TLS 连接管理、Memory BIO 操作和 ALPN 回调添加注释
- http2.c: 移除过时的 TODO 占位注释(请求体收集已实现)
2026-06-07 09:05:45 +08:00

131 lines
2.8 KiB
C
Raw 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.

/**
* log.c - 简单日志系统实现
*
* @author xfy
*/
#include "log.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>
static log_level_t g_level = LOG_LEVEL_INFO;
static const char *g_prefix = "[Cocoon]";
/**
* level_str - 将日志级别转换为字符串
*
* @param level 日志级别
* @return 级别名称ERROR/WARN/INFO/DEBUG/UNKNOWN
*/
static const char *level_str(log_level_t level) {
switch (level) {
case LOG_LEVEL_ERROR: return "ERROR";
case LOG_LEVEL_WARN: return "WARN";
case LOG_LEVEL_INFO: return "INFO";
case LOG_LEVEL_DEBUG: return "DEBUG";
default: return "UNKNOWN";
}
}
/**
* log_set_level - 设置全局日志级别
*
* 低于此级别的日志消息将被忽略。
*
* @param level 日志级别
*/
void log_set_level(log_level_t level) {
g_level = level;
}
/**
* log_set_prefix - 设置日志前缀
*
* @param prefix 前缀字符串,设为 NULL 则无前缀
*/
void log_set_prefix(const char *prefix) {
g_prefix = prefix;
}
/**
* log_get_level - 获取当前日志级别
*
* @return 当前日志级别
*/
log_level_t log_get_level(void) {
return g_level;
}
/**
* log_output - 日志输出核心函数
*
* 格式化时间戳、前缀、级别和消息,输出到 stderr。
* 若日志级别低于全局级别则直接返回。
*
* @param level 日志级别
* @param fmt 格式字符串
* @param args 可变参数列表
*/
static void log_output(log_level_t level, const char *fmt, va_list args) {
if (level > g_level) return;
time_t now = time(NULL);
struct tm *tm_info = localtime(&now);
char time_buf[32];
strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", tm_info);
if (g_prefix) {
fprintf(stderr, "%s %s [%s] ", time_buf, g_prefix, level_str(level));
} else {
fprintf(stderr, "%s [%s] ", time_buf, level_str(level));
}
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
}
/**
* log_error - 输出 ERROR 级别日志
* @param fmt 格式字符串
*/
void log_error(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
log_output(LOG_LEVEL_ERROR, fmt, args);
va_end(args);
}
/**
* log_warn - 输出 WARN 级别日志
* @param fmt 格式字符串
*/
void log_warn(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
log_output(LOG_LEVEL_WARN, fmt, args);
va_end(args);
}
/**
* log_info - 输出 INFO 级别日志
* @param fmt 格式字符串
*/
void log_info(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
log_output(LOG_LEVEL_INFO, fmt, args);
va_end(args);
}
/**
* log_debug - 输出 DEBUG 级别日志
* @param fmt 格式字符串
*/
void log_debug(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
log_output(LOG_LEVEL_DEBUG, fmt, args);
va_end(args);
}