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