log: add internal function that logs to syslog

Differences to the console logger:

* No coloring
* Always use module name, not filename:line-number
This commit is contained in:
Daniel Eklöf 2019-01-26 14:53:28 +01:00
parent 453364e9f8
commit 89a61eed7b

46
log.c
View file

@ -1,10 +1,12 @@
#include "log.h" #include "log.h"
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <errno.h> #include <errno.h>
#include <assert.h>
#include <syslog.h> #include <syslog.h>
@ -57,6 +59,50 @@ _log(enum log_class log_class, const char *module, const char *file, int lineno,
printf("\n"); printf("\n");
} }
static void
_sys_log(enum log_class log_class, const char *module, const char *file,
int lineno, const char *fmt, int sys_errno, va_list va)
{
/* Map our log level to syslog's level */
int level = -1;
switch (log_class) {
case LOG_CLASS_ERROR: level = LOG_ERR; break;
case LOG_CLASS_WARNING: level = LOG_WARNING; break;
case LOG_CLASS_INFO: level = LOG_INFO; break;
case LOG_CLASS_DEBUG: level = LOG_DEBUG; break;
}
assert(level != -1);
const char *sys_err = sys_errno != 0 ? strerror(sys_errno) : NULL;
va_list va2;
va_copy(va2, va);
/* Calculate required size of buffer holding the entire log message */
int required_len = 0;
required_len += strlen(module) + 2; /* "%s: " */
required_len += vsnprintf(NULL, 0, fmt, va2); va_end(va2);
if (sys_errno != 0)
required_len += strlen(sys_err) + 2; /* ": %s" */
/* Format the msg */
char *msg = malloc(required_len + 1);
int idx = 0;
idx += snprintf(&msg[idx], required_len + 1 - idx, "%s: ", module);
idx += vsnprintf(&msg[idx], required_len + 1 - idx, fmt, va);
if (sys_errno != 0) {
idx += snprintf(
&msg[idx], required_len + 1 - idx, ": %s", strerror(sys_errno));
}
syslog(level, "%s", msg);
free(msg);
}
void void
log_msg(enum log_class log_class, const char *module, log_msg(enum log_class log_class, const char *module,
const char *file, int lineno, const char *fmt, ...) const char *file, int lineno, const char *fmt, ...)