- 新增 log.c/log.h 分级日志系统(error/warn/info/debug) - 新增连接空闲超时管理:使用 coco_timer + shutdown + coco_cancel 自动清理长时间无数据的僵尸连接,默认 30 秒 - 新增最大并发连接数限制(-m <num>),超限返回 503 - 命令行新增选项:-m 最大连接数, -o 超时毫秒, -l 日志级别 - 替换所有 printf 为 log_info/log_error/log_debug 等分级输出 - 编译通过,单线程/多线程模式均正常
82 lines
1.8 KiB
C
82 lines
1.8 KiB
C
/**
|
|
* 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]";
|
|
|
|
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";
|
|
}
|
|
}
|
|
|
|
void log_set_level(log_level_t level) {
|
|
g_level = level;
|
|
}
|
|
|
|
void log_set_prefix(const char *prefix) {
|
|
g_prefix = prefix;
|
|
}
|
|
|
|
log_level_t log_get_level(void) {
|
|
return g_level;
|
|
}
|
|
|
|
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");
|
|
}
|
|
|
|
void log_error(const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
log_output(LOG_LEVEL_ERROR, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void log_warn(const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
log_output(LOG_LEVEL_WARN, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void log_info(const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
log_output(LOG_LEVEL_INFO, fmt, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void log_debug(const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
log_output(LOG_LEVEL_DEBUG, fmt, args);
|
|
va_end(args);
|
|
}
|