log: Add support for journal logging

This logging is available if the software was build with the configure
option --with-systemd-journal.

It will be enabled by default if libsystemd is found.

The runtime parameter --log-journal enables to output of log messages
to the systemd journal.

Please note that the journal priority field has the same value as the
syslog level so no conversion is required here.
This commit is contained in:
Torsten Hilbrich
2017-06-21 12:59:35 +02:00
committed by Aleksander Morgado
parent 13592c5d2d
commit fd0bed1df9
8 changed files with 109 additions and 0 deletions

View File

@@ -242,6 +242,40 @@ esac
AM_CONDITIONAL(SUSPEND_RESUME_SYSTEMD, test "x$with_suspend_resume" = "xsystemd")
dnl-----------------------------------------------------------------------------
dnl systemd journal support
dnl
AC_ARG_WITH(systemd-journal,
AS_HELP_STRING([--with-systemd-journal=no|yes|auto],
[Enable systemd journal support [[default=auto]]]),,
[with_systemd_journal=auto])
if test "x$with_systemd_journal" = "xauto"; then
if test "x$have_libsystemd" = "xyes"; then
with_systemd_journal=yes
else
with_systemd_journal=no
fi
fi
case $with_systemd_journal in
no)
AC_DEFINE(WITH_SYSTEMD_JOURNAL, 0, [Define if you want systemd journal support])
;;
yes)
if test "x$have_libsystemd" = "xno"; then
AC_MSG_ERROR(libsystemd development headers are required)
fi
AC_DEFINE(WITH_SYSTEMD_JOURNAL, 1, [Define if you want systemd journal support])
;;
*)
AC_MSG_ERROR([Wrong value for --with-systemd-journal: $with_systemd_journal])
;;
esac
AM_CONDITIONAL(WITH_SYSTEMD_JOURNAL, test "x$with_systemd_journal" = "xyes")
dnl-----------------------------------------------------------------------------
dnl PolicyKit
dnl
@@ -425,6 +459,7 @@ echo "
mbim support: ${with_mbim}
qmi support: ${with_qmi}
suspend/resume support: ${with_suspend_resume}
systemd journal support: ${with_systemd_journal}
Miscellaneous:
gobject introspection: ${found_introspection}

View File

@@ -50,6 +50,9 @@ messages are logged. Given level must be one of "ERR", "WARN", "INFO" or "DEBUG"
Specify location of the file where ModemManager will dump its log messages,
instead of syslog.
.TP
.B \-\-log\-journal
Output log message to the systemd journal.
.TP
.B \-\-log\-timestamps
Include absolute timestamps in the log output.
.TP

View File

@@ -46,6 +46,11 @@ AM_CFLAGS += $(POLKIT_CFLAGS)
AM_LDFLAGS += $(POLKIT_LIBS)
endif
if WITH_SYSTEMD_JOURNAL
AM_CFLAGS += $(LIBSYSTEMD_CFLAGS)
AM_LDFLAGS += $(LIBSYSTEMD_LIBS)
endif
################################################################################
# generic udev rules
################################################################################

View File

@@ -141,6 +141,7 @@ main (int argc, char *argv[])
if (!mm_log_setup (mm_context_get_log_level (),
mm_context_get_log_file (),
mm_context_get_log_journal (),
mm_context_get_log_timestamps (),
mm_context_get_log_relative_timestamps (),
&err)) {

View File

@@ -89,6 +89,7 @@ mm_context_get_no_auto_scan (void)
static const gchar *log_level;
static const gchar *log_file;
static gboolean log_journal;
static gboolean log_show_ts;
static gboolean log_rel_ts;
@@ -103,6 +104,13 @@ static const GOptionEntry log_entries[] = {
"Path to log file",
"[PATH]"
},
#if WITH_SYSTEMD_JOURNAL
{
"log-journal", 0, 0, G_OPTION_ARG_NONE, &log_journal,
"Log to systemd journal",
NULL
},
#endif
{
"log-timestamps", 0, 0, G_OPTION_ARG_NONE, &log_show_ts,
"Show timestamps in log output",
@@ -142,6 +150,12 @@ mm_context_get_log_file (void)
return log_file;
}
gboolean
mm_context_get_log_journal (void)
{
return log_journal;
}
gboolean
mm_context_get_log_timestamps (void)
{

View File

@@ -33,6 +33,7 @@ gboolean mm_context_get_no_auto_scan (void);
/* Logging support */
const gchar *mm_context_get_log_level (void);
const gchar *mm_context_get_log_file (void);
gboolean mm_context_get_log_journal (void);
gboolean mm_context_get_log_timestamps (void);
gboolean mm_context_get_log_relative_timestamps (void);

View File

@@ -35,6 +35,11 @@
#include <libmbim-glib.h>
#endif
#if defined WITH_SYSTEMD_JOURNAL
#define SD_JOURNAL_SUPPRESS_LOCATION
#include <systemd/sd-journal.h>
#endif
#include "mm-log.h"
enum {
@@ -148,6 +153,43 @@ log_backend_syslog (const char *loc,
syslog (syslog_level, "%s", message);
}
#if defined WITH_SYSTEMD_JOURNAL
static void
log_backend_systemd_journal (const char *loc,
const char *func,
int syslog_level,
const char *message,
size_t length)
{
const char *line;
size_t file_length;
if (loc == NULL) {
sd_journal_send ("MESSAGE=%s", message,
"PRIORITY=%d", syslog_level,
NULL);
return;
}
line = strstr (loc, ":");
if (line) {
file_length = line - loc;
line++;
} else {
/* This is not supposed to happen but we must be prepared for this */
line = loc;
file_length = 0;
}
sd_journal_send ("MESSAGE=%s", message,
"PRIORITY=%d", syslog_level,
"CODE_FUNC=%s", func,
"CODE_FILE=%.*s", file_length, loc,
"CODE_LINE=%s", line,
NULL);
}
#endif
void
_mm_log (const char *loc,
const char *func,
@@ -242,6 +284,7 @@ mm_log_set_level (const char *level, GError **error)
gboolean
mm_log_setup (const char *level,
const char *log_file,
gboolean log_journal,
gboolean show_timestamps,
gboolean rel_timestamps,
GError **error)
@@ -258,6 +301,12 @@ mm_log_setup (const char *level,
/* Grab start time for relative timestamps */
g_get_current_time (&rel_start);
#if defined WITH_SYSTEMD_JOURNAL
if (log_journal) {
log_backend = log_backend_systemd_journal;
append_log_level_text = FALSE;
} else
#endif
if (log_file == NULL) {
openlog (G_LOG_DOMAIN, LOG_CONS | LOG_PID | LOG_PERROR, LOG_DAEMON);
log_backend = log_backend_syslog;

View File

@@ -51,6 +51,7 @@ gboolean mm_log_set_level (const char *level, GError **error);
gboolean mm_log_setup (const char *level,
const char *log_file,
gboolean log_journal,
gboolean show_ts,
gboolean rel_ts,
GError **error);