// retoor #include "logger.h" #include #include #include #include #include struct logger_t { log_level_t level; }; static const char *level_strings[] = { "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" }; static const char *level_colors[] = { "\033[90m", "\033[36m", "\033[32m", "\033[33m", "\033[31m", "\033[35m" }; static const char *color_reset = "\033[0m"; logger_handle logger_create(log_level_t level) { struct logger_t *logger = malloc(sizeof(struct logger_t)); if (!logger) return NULL; logger->level = level; return logger; } void logger_destroy(logger_handle logger) { if (logger) free(logger); } void logger_set_level(logger_handle logger, log_level_t level) { if (logger) logger->level = level; } log_level_t logger_get_level(logger_handle logger) { return logger ? logger->level : LOG_LEVEL_INFO; } void logger_log(logger_handle logger, log_level_t level, const char *file, int line, const char *fmt, ...) { if (!logger || !fmt) return; if (level < logger->level) return; va_list args; va_start(args, fmt); 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); const char *basename = strrchr(file, '/'); basename = basename ? basename + 1 : file; fprintf(stderr, "%s[%s%s%s %s:%d] ", level_colors[level], level_strings[level], color_reset, basename, line); vfprintf(stderr, fmt, args); fprintf(stderr, "%s\n", color_reset); va_end(args); }