96 lines
2.6 KiB
C
96 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <config.h>
|
|
#include <logger.h>
|
|
|
|
const char *COLOR_DEBUG = COLOR_GREEN;
|
|
const char *COLOR_INFO = COLOR_CYAN;
|
|
const char *COLOR_NOTICE = COLOR_CYAN;
|
|
const char *COLOR_WARNING = COLOR_YELLOW;
|
|
const char *COLOR_ERR = COLOR_RED;
|
|
const char *COLOR_CRIT = COLOR_MAGENTA;
|
|
const char *COLOR_EMERG = COLOR_MAGENTA;
|
|
|
|
void
|
|
logger_log(int level, const char *filename, int line, const char *func, const char *msg, ...)
|
|
{
|
|
if(global_config->logging.level < level)
|
|
{
|
|
return;
|
|
}
|
|
va_list args;
|
|
const char *level_str;
|
|
const char *color;
|
|
|
|
switch(level)
|
|
{
|
|
case LOG_DEBUG:
|
|
color = COLOR_DEBUG;
|
|
level_str = "DEBUG";
|
|
break;
|
|
case LOG_INFO:
|
|
color = COLOR_INFO;
|
|
level_str = "INFO";
|
|
break;
|
|
case LOG_NOTICE:
|
|
color = COLOR_NOTICE;
|
|
level_str = "NOTE";
|
|
break;
|
|
case LOG_WARNING:
|
|
color = COLOR_WARNING;
|
|
level_str = "WARN";
|
|
break;
|
|
case LOG_ERR:
|
|
color = COLOR_ERR;
|
|
level_str = "ERROR";
|
|
break;
|
|
case LOG_CRIT:
|
|
color = COLOR_CRIT;
|
|
level_str = "CRIT";
|
|
break;
|
|
case LOG_EMERG:
|
|
color = COLOR_EMERG;
|
|
level_str = "EMERG";
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
char timestamp_str[32];
|
|
time_t rawtime;
|
|
time(&rawtime);
|
|
strftime(timestamp_str, 32, "%Y-%m-%d %H:%M:%S", localtime(&rawtime));
|
|
size_t timestamp_len = strlen(timestamp_str);
|
|
|
|
size_t buffer_size = 128;
|
|
buffer_size += timestamp_len;
|
|
buffer_size += strlen(filename);
|
|
buffer_size += strlen(func);
|
|
buffer_size += strlen(msg);
|
|
|
|
char *buffer = malloc(sizeof(char) * (buffer_size));
|
|
sprintf(buffer, "%s %s[%5s] %s:%d:%s " COLOR_NONE "%s", timestamp_str, color, level_str, filename, line, func, msg);
|
|
|
|
// start arg va_list and find log_len
|
|
va_start(args, msg);
|
|
size_t log_len = vsnprintf(NULL, 0, buffer, args); // NOLINT(clang-analyzer-valist.Uninitialized): clang-tidy bug
|
|
va_end(args);
|
|
|
|
char *log_line = malloc(sizeof(char) * (log_len + 1));
|
|
|
|
// start arg va_list again and write log_line
|
|
va_start(args, msg);
|
|
vsprintf(log_line, buffer, args); // NOLINT(clang-analyzer-valist.Uninitialized): clang-tidy bug
|
|
va_end(args);
|
|
|
|
syslog(level, "%s", log_line + timestamp_len + 1);
|
|
|
|
fprintf(global_config->logging.file, "%s", log_line);
|
|
fflush(global_config->logging.file);
|
|
|
|
free(buffer);
|
|
free(log_line);
|
|
}
|