From 5aba8a2fa639bc65dd5ad786f8a725f5276c18e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Mon, 14 Jun 2021 21:37:25 +0200 Subject: [PATCH] feat: add logger --- image-viewer/include/logger.h | 44 ++++++++++++++ image-viewer/src/logger.c | 105 ++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 image-viewer/include/logger.h create mode 100644 image-viewer/src/logger.c diff --git a/image-viewer/include/logger.h b/image-viewer/include/logger.h new file mode 100644 index 0000000..5ddb30d --- /dev/null +++ b/image-viewer/include/logger.h @@ -0,0 +1,44 @@ +#ifndef _LOGGER_H +#define _LOGGER_H + +#include + +#define DEBUG_PREFIX "[DEBG]" +#define INFO_PREFIX "[INFO]" +#define WARN_PREFIX "[WARN]" +#define ERROR_PREFIX "[ERRO]" + +typedef enum LogLevel { + LOG_DEBUG = 1, + LOG_INFO = 2, + LOG_WARN = 3, + LOG_ERROR = 4, +} LogLevel; + +typedef struct logger_t logger_t; + +struct logger_t { + FILE *debugFile; + FILE *infoFile; + FILE *warningFile; + FILE *errorFile; + + LogLevel minimalLevel; + + logger_t *childLogger; // Duplicate logs to this logger +}; + +logger_t logger_create(LogLevel minimalLevel, FILE *debugFile, FILE *infoFile, FILE *warningFile, + FILE *errorFile, logger_t *childLogger); + +void logger_log(logger_t *logger, LogLevel level, const char *file, const char *function, int line, const char *const message, ...); +void logger_debug(logger_t *logger, const char *file, const char *function, + int line, const char *const message, ...); +void logger_info(logger_t *logger, const char *file, const char *function, + int line, const char *const message, ...); +void logger_warn(logger_t *logger, const char *file, const char *function, + int line, const char *const message, ...); +void logger_error(logger_t *logger, const char *file, const char *function, + int line, const char *const message, ...); + +#endif //_LOGGER_H diff --git a/image-viewer/src/logger.c b/image-viewer/src/logger.c new file mode 100644 index 0000000..b7b3fba --- /dev/null +++ b/image-viewer/src/logger.c @@ -0,0 +1,105 @@ +#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; + } + + assert(file != NULL); + fprintf(file, "["); + print_time(file); + fprintf(file, "] %s: ", prefix); + vfprintf(file, message, args); + fprintf(file, "(%s/%s:%s)", 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); +} -- 2.48.1