Added system logging for important errors

* Messages with "fatal" or "error" log level are now also passed to
  syslogd service with help of vsyslog() function.
* On systems that use syslog service, these messages will be available
  in default system log files like /var/log/syslog or /var/log/messages.
This commit is contained in:
KLuka 2015-08-21 18:07:26 +02:00
parent dfd885c011
commit d74e60b6a7
2 changed files with 25 additions and 2 deletions

View file

@ -29,8 +29,8 @@ dnl Overwrite default archiver flags.
AC_SUBST(AR_FLAGS, [cr]) AC_SUBST(AR_FLAGS, [cr])
dnl Check for header files that do not exist on all platforms dnl Check for header files that do not exist on all platforms
AC_CHECK_HEADERS([libutil.h pthread.h pty.h strings.h sys/prctl.h sys/uio.h \ AC_CHECK_HEADERS([libutil.h pthread.h pty.h strings.h syslog.h sys/prctl.h \
util.h utmp.h utmpx.h]) sys/uio.h util.h utmp.h utmpx.h])
dnl Most systems require linking against libutil.so in order to get login_tty() dnl Most systems require linking against libutil.so in order to get login_tty()
AC_CHECK_FUNCS(login_tty, [], AC_CHECK_FUNCS(login_tty, [],
@ -41,6 +41,9 @@ AC_CHECK_FUNCS(login_tty, [],
dnl Use strlcat() instead of strncat() to avoid spurious warnings dnl Use strlcat() instead of strncat() to avoid spurious warnings
AC_CHECK_FUNCS([strlcat]) AC_CHECK_FUNCS([strlcat])
dnl Use vsyslog() for logging important error messages
AC_CHECK_FUNCS([vsyslog])
dnl Prefer thread-safe functions, if available dnl Prefer thread-safe functions, if available
AC_CHECK_FUNCS([getgrgid_r getgrnam_r gethostbyname_r getpwnam_r getpwuid_r \ AC_CHECK_FUNCS([getgrgid_r getgrnam_r gethostbyname_r getpwnam_r getpwuid_r \
openpty strcasestr getresuid getresgid setresuid setresgid ]) openpty strcasestr getresuid getresgid setresuid setresgid ])

View file

@ -52,6 +52,19 @@
#include "logging/logging.h" #include "logging/logging.h"
#ifdef HAVE_SYSLOG_H
# include <syslog.h>
# ifndef HAVE_VSYSLOG
static void vsyslog(int priority, const char *fmt, va_list ap) {
char *s = vStringPrintf(NULL, fmt, ap);
if (s) {
syslog(priority, "%s", s);
free(s);
}
}
# endif
#endif
static int verbosity = MSG_DEFAULT; static int verbosity = MSG_DEFAULT;
static void debugMsg(int level, const char *fmt, va_list ap) { static void debugMsg(int level, const char *fmt, va_list ap) {
@ -86,6 +99,9 @@ void error(const char *fmt, ...) {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
debugMsg(MSG_ERROR, fmt, ap); debugMsg(MSG_ERROR, fmt, ap);
#ifdef HAVE_SYSLOG_H
vsyslog(LOG_ERR, fmt, ap);
#endif
va_end(ap); va_end(ap);
} }
@ -100,6 +116,10 @@ void fatal(const char *fmt, ...) {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
debugMsg(MSG_QUIET, fmt, ap); debugMsg(MSG_QUIET, fmt, ap);
#ifdef HAVE_SYSLOG_H
vsyslog(LOG_CRIT, fmt, ap);
syslog(LOG_CRIT, "Aborting...");
#endif
va_end(ap); va_end(ap);
_exit(1); _exit(1);
} }