149 lines
2.8 KiB
C
149 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#include "logger.h"
|
|
Logger logger;
|
|
|
|
void create_logger(char* logpath, LogLevel level) {
|
|
logger = malloc(sizeof(*logger));
|
|
|
|
logger->t0 = clock();
|
|
logger->level = level;
|
|
|
|
if (logpath[0] != '\0')
|
|
{
|
|
logger->logfile = fopen(logpath, "w");
|
|
}
|
|
else
|
|
logger->logfile = NULL;
|
|
}
|
|
|
|
void destroy_logger() {
|
|
if (logger->logfile != NULL)
|
|
fclose(logger->logfile);
|
|
free(logger);
|
|
}
|
|
|
|
void logprint(LogLevel level, char* str, va_list args)
|
|
{
|
|
clock_t t = clock();
|
|
|
|
char label[6];
|
|
switch (level)
|
|
{
|
|
case (PANIC):
|
|
strcpy(label, "PANIC");
|
|
break;
|
|
case (FATAL):
|
|
strcpy(label, "FATAL");
|
|
break;
|
|
case (ERROR):
|
|
strcpy(label, "ERROR");
|
|
break;
|
|
case (WARN):
|
|
strcpy(label, "WARN");
|
|
break;
|
|
case (INFO):
|
|
strcpy(label, "INFO");
|
|
break;
|
|
case (DEBUG):
|
|
strcpy(label, "DEBUG");
|
|
break;
|
|
case (TRACE):
|
|
strcpy(label, "TRACE");
|
|
break;
|
|
}
|
|
|
|
FILE* stream = (level >= WARN) ? stderr : stdout;
|
|
|
|
if (level < logger->level)
|
|
return;
|
|
|
|
fprintf(stream, "[%s][%f]: ", label, (double)t / CLOCKS_PER_SEC);
|
|
vfprintf(stream, str, args);
|
|
fprintf(stream, "\n");
|
|
|
|
if (logger->logfile != NULL)
|
|
{
|
|
fprintf(logger->logfile, "[%s][%f]: ", label, (double)t / CLOCKS_PER_SEC);
|
|
vfprintf(logger->logfile, str, args);
|
|
fprintf(logger->logfile, "\n");
|
|
}
|
|
}
|
|
|
|
|
|
void panic(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(PANIC, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void fatal(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(FATAL, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void error(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(ERROR, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void warn(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(WARN, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void info(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(INFO, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void debug(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(DEBUG, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
void trace(char *str, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, str);
|
|
logprint(TRACE, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
create_logger("logger.log", TRACE);
|
|
|
|
info("Je me lève.");
|
|
trace("Il y a un oiseau derrière la fenêtre.");
|
|
info("Je sors de ma chambre. Il fait %d degrés.", 18);
|
|
warn("Je trébuche.");
|
|
info("Je descends les escaliers");
|
|
info("Je suis dans la rue");
|
|
panic("Je meurs");
|
|
|
|
destroy_logger();
|
|
}
|