cocoon/log.c
xfy911 0dc2bb5b4e feat(server): 连接空闲超时 + 最大并发限制 + 分级日志
- 新增 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 等分级输出
- 编译通过,单线程/多线程模式均正常
2026-06-03 18:13:29 +08:00

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