#include <stdio.h>
#include <string.h>
enum LogLevel {DEBUG=10, INFO=20, WARN=30, ERROR=40};
typedef struct logger {
int level;
FILE** handlers; // NULL for sentinel
} Logger;
Logger LOGGER;
char* level_str(int level)
{
switch (level) {
case DEBUG: return "DEBUG";
case INFO: return "INFO";
case WARN: return "WARN";
case ERROR: return "ERROR";
default: return "UNKNOWN";
};
}
void logger(char* msg, int level)
{
// skip if level is too low or no handlers set up
if (level < LOGGER.level || !LOGGER.handlers) return;
// write to each handler
for (int i=0; LOGGER.handlers[i]; i++)
fprintf(LOGGER.handlers[i], "[%s] %s\n", level_str(level), msg);
}
int main(void)
{
LOGGER.level = DEBUG;
FILE* handler1 = stderr;
FILE* handler2 = fopen("z_log.txt", "w");
LOGGER.handlers = &handler1;
LOGGER.handlers[1] = handler2;
LOGGER.handlers[2] = NULL;
logger("Hello", INFO);
return 0;
}
[INFO] Hello