#include "logger.h" #include #include #include #include #include logger_t logger_create(LogLevel minimalLevel, FILE *debugFile, FILE *infoFile, FILE *warningFile, FILE *errorFile, logger_t *childLogger) { logger_t logger = { debugFile, infoFile, warningFile, errorFile, minimalLevel, childLogger }; return logger; } void print_time(FILE *file) { time_t now; time(&now); struct tm *local = localtime(&now); fprintf(file, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec); } void logger_log_vaargs(logger_t *logger, LogLevel level, const char *file_name, const char *function, int line, const char *const message, va_list args) { if (logger->childLogger != NULL) { va_list copy; va_copy(copy, args); logger_log_vaargs(logger->childLogger, level, file_name, function, line, message, copy); va_end(copy); } if (level < logger->minimalLevel) { return; } FILE *file = NULL; const char *prefix; switch (level) { case LOG_DEBUG: file = logger->debugFile; prefix = DEBUG_PREFIX; break; case LOG_INFO: file = logger->infoFile; prefix = INFO_PREFIX; break; case LOG_WARN: file = logger->warningFile; prefix = WARN_PREFIX; break; case LOG_ERROR: file = logger->errorFile; prefix = ERROR_PREFIX; break; default: prefix = "UNKN"; file = logger->errorFile; break; } assert(file != NULL); fprintf(file, "["); print_time(file); fprintf(file, "] %s: ", prefix); vfprintf(file, message, args); fprintf(file, " (%s/%s:%d)", file_name, function, line); fprintf(file, "\r\n"); } void logger_log(logger_t *logger, LogLevel level, const char *file, const char *function, int line, const char *const message, ...) { va_list args; va_start(args, message); logger_log_vaargs(logger, level, file, function, line, message, args); va_end(args); } void logger_debug(logger_t *logger, const char *file, const char *function, int line, const char *const message, ...) { va_list args; va_start(args, message); logger_log_vaargs(logger, LOG_DEBUG, file, function, line, message, args); va_end(args); } void logger_info(logger_t *logger, const char *file, const char *function, int line, const char *const message, ...) { va_list args; va_start(args, message); logger_log_vaargs(logger, LOG_INFO, file, function, line, message, args); va_end(args); } void logger_warn(logger_t *logger, const char *file, const char *function, int line, const char *const message, ...) { va_list args; va_start(args, message); logger_log_vaargs(logger, LOG_WARN, file, function, line, message, args); va_end(args); } void logger_error(logger_t *logger, const char *file, const char *function, int line, const char *const message, ...) { va_list args; va_start(args, message); logger_log_vaargs(logger, LOG_ERROR, file, function, line, message, args); va_end(args); }