1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

log: OOP refactoring

This commit is contained in:
Steffen Vogel 2017-02-16 09:29:04 -03:00
parent 32186d8426
commit 9b2b287584
2 changed files with 129 additions and 37 deletions

View file

@ -56,6 +56,24 @@ enum log_facilities {
LOG_ALL = ~0xFF
};
struct log {
struct timespec epoch; /**< A global clock used to prefix the log messages. */
/** Debug level used by the debug() macro.
* It defaults to V (defined by the Makefile) and can be
* overwritten by the 'debug' setting in the configuration file. */
int level;
/** Debug facilities used by the debug() macro. */
int facilities;
};
/** Initialize log object */
int log_init(struct log *l);
/** Destroy log object */
int log_destroy(struct log *l);
/** Change log indention for current thread.
*
* The argument level can be negative!
@ -69,23 +87,30 @@ int log_indent(int levels);
*/
void log_outdent(int *);
/** Set the verbosity level of debug messages.
/** Set logging facilities based on expression.
*
* @param lvl The new debug level.
* @param fac The new mask for debug facilities.
* Currently we support two types of expressions:
* 1. A comma seperated list of logging facilities
* 2. A comma seperated list of logging facilities which is prefixes with an exclamation mark '!'
*
* The first case enables only faciltities which are in the list.
* The second case enables all faciltities with exception of those which are in the list.
*
* @param expression The expression
* @return The new facilties mask (see enum log_faciltities)
*/
void log_setlevel(int lvl, int fac);
int log_set_facility_expression(struct log *l, const char *expression);
/** Reset the wallclock of debug messages. */
void log_init();
/** Parse logging configuration. */
int log_parse(struct log *l, config_setting_t *cfg);
/** Logs variadic messages to stdout.
*
* @param lvl The log level
* @param fmt The format string (printf alike)
*/
void log_print(const char *lvl, const char *fmt, ...)
__attribute__ ((format(printf, 2, 3)));
void log_print(struct log *l, const char *lvl, const char *fmt, ...)
__attribute__ ((format(printf, 3, 4)));
/** Logs variadic messages to stdout.
*
@ -93,7 +118,7 @@ void log_print(const char *lvl, const char *fmt, ...)
* @param fmt The format string (printf alike)
* @param va The variadic argument list (see stdarg.h)
*/
void log_vprint(const char *lvl, const char *fmt, va_list va);
void log_vprint(struct log *l, const char *lvl, const char *fmt, va_list va);
/** Printf alike debug message with level. */
void debug(long lvl, const char *fmt, ...)

123
lib/log.c
View file

@ -23,16 +23,27 @@
#include "OpalPrint.h"
#endif
/** Debug level used by the debug() macro.
* It defaults to V (defined by the Makefile) and can be
* overwritten by the 'debug' setting in the configuration file. */
static unsigned level = V;
static struct log *log;
/** Debug facilities used by the debug() macro. */
static unsigned facilities = ~0;
/** A global clock used to prefix the log messages. */
static struct timespec epoch;
/** List of debug facilities as strings */
static const char *facilities_strs[] = {
"pool", /* LOG_POOL */
"queue", /* LOG_QUEUE */
"config", /* LOG_CONFIG */
"hook", /* LOG_HOOK */
"path", /* LOG_PATH */
"mem", /* LOG_MEM */
"web", /* LOG_WEB */
"api", /* LOG_API */
/* Node-types */
"socket", /* LOG_SOCKET */
"file", /* LOG_FILE */
"fpga", /* LOG_FPGA */
"ngsi", /* LOG_NGSI */
"websocket", /* LOG_WEBSOCKET */
"opal" /* LOG_OPAL */
};
#ifdef __GNUC__
/** The current log indention level (per thread!). */
@ -51,34 +62,78 @@ void log_outdent(int *old)
}
#endif
void log_setlevel(int lvl, int fac)
int log_set_facility_expression(struct log *l, const char *expression)
{
level = lvl;
debug(10, "Switched to debug level %u", level);
char *copy, *facility_str;
enum {
NORMAL,
NEGATE
} mode;
if (strlen(expression) <= 0)
return -1;
if (expression[0] == '!') {
mode = NEGATE;
l->facilities = ~0xFF;
}
else {
mode = NORMAL;
l->facilities = 0;
}
copy = strdup(expression);
facility_str = strtok(copy, ",");
while (facility_str != NULL) {
for (int i = 0; i < ARRAY_LEN(facilities_strs); i++) {
if (strcmp(facilities_strs[i], facility_str)) {
switch (mode) {
case NORMAL: l->facilities |= (1 << (i+8));
case NEGATE: l->facilities &= ~(1 << (i+8));
}
}
}
facility_str = strtok(NULL, ",");
}
free(copy);
return l->facilities;
}
void log_init()
int log_init(struct log *l)
{
epoch = time_now();
debug(10, "Debug clock resetted");
l->epoch = time_now();
l->level = V;
l->facilities = LOG_ALL;
debug(LOG_LOG | 10, "Log sub-system intialized");
/* Register this log instance globally */
log = l;
return 0;
}
void log_print(const char *lvl, const char *fmt, ...)
void log_print(struct log *l, const char *lvl, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
log_vprint(lvl, fmt, ap);
log_vprint(l, lvl, fmt, ap);
va_end(ap);
}
void log_vprint(const char *lvl, const char *fmt, va_list ap)
void log_vprint(struct log *l, const char *lvl, const char *fmt, va_list ap)
{
struct timespec ts = time_now();
char *buf = alloc(512);
/* Timestamp */
strcatf(&buf, "%10.3f ", time_delta(&epoch, &ts));
strcatf(&buf, "%10.3f ", time_delta(&l->epoch, &ts));
/* Severity */
strcatf(&buf, "%5s ", lvl);
@ -102,12 +157,24 @@ void log_vprint(const char *lvl, const char *fmt, va_list ap)
free(buf);
}
int log_parse(struct log *l, config_setting_t *cfg)
{
const char *facilities;
config_setting_lookup_int(cfg, "level", &l->level);
if (config_setting_lookup_string(cfg, "facilties", &facilities))
log_set_facility_expression(l, facilities);
return 0;
}
void line()
{
char buf[LOG_WIDTH];
memset(buf, 0x71, sizeof(buf));
log_print("", "\b" ACS("%.*s"), LOG_WIDTH, buf);
log_print(log, "", "\b" ACS("%.*s"), LOG_WIDTH, buf);
}
void debug(long class, const char *fmt, ...)
@ -117,9 +184,9 @@ void debug(long class, const char *fmt, ...)
int lvl = class & 0xFF;
int fac = class & ~0xFF;
if (((fac == 0) || (fac & facilities)) && (lvl <= level)) {
if (((fac == 0) || (fac & log->facilities)) && (lvl <= log->level)) {
va_start(ap, fmt);
log_vprint(LOG_LVL_DEBUG, fmt, ap);
log_vprint(log, LOG_LVL_DEBUG, fmt, ap);
va_end(ap);
}
}
@ -129,7 +196,7 @@ void info(const char *fmt, ...)
va_list ap;
va_start(ap, fmt);
log_vprint(LOG_LVL_INFO, fmt, ap);
log_vprint(log, LOG_LVL_INFO, fmt, ap);
va_end(ap);
}
@ -138,7 +205,7 @@ void warn(const char *fmt, ...)
va_list ap;
va_start(ap, fmt);
log_vprint(LOG_LVL_WARN, fmt, ap);
log_vprint(log, LOG_LVL_WARN, fmt, ap);
va_end(ap);
}
@ -147,7 +214,7 @@ void stats(const char *fmt, ...)
va_list ap;
va_start(ap, fmt);
log_vprint(LOG_LVL_STATS, fmt, ap);
log_vprint(log, LOG_LVL_STATS, fmt, ap);
va_end(ap);
}
@ -156,7 +223,7 @@ void error(const char *fmt, ...)
va_list ap;
va_start(ap, fmt);
log_vprint(LOG_LVL_ERROR, fmt, ap);
log_vprint(log, LOG_LVL_ERROR, fmt, ap);
va_end(ap);
die();
@ -171,7 +238,7 @@ void serror(const char *fmt, ...)
vstrcatf(&buf, fmt, ap);
va_end(ap);
log_print(LOG_LVL_ERROR, "%s: %m (%u)", buf, errno);
log_print(log, LOG_LVL_ERROR, "%s: %m (%u)", buf, errno);
free(buf);
die();
@ -186,7 +253,7 @@ void cerror(config_setting_t *cfg, const char *fmt, ...)
vstrcatf(&buf, fmt, ap);
va_end(ap);
log_print(LOG_LVL_ERROR, "%s in %s:%u", buf,
log_print(log, LOG_LVL_ERROR, "%s in %s:%u", buf,
config_setting_source_file(cfg)
? config_setting_source_file(cfg)
: "(stdio)",