@@ 0,0 1,44 @@
+#ifndef _LOGGER_H
+#define _LOGGER_H
+
+#include <stdio.h>
+
+#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
@@ 0,0 1,105 @@
+#include "logger.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+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);
+}