// retoor <retoor@molodetz.nl>
#include "logger.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
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);
}