aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac35
-rw-r--r--docs/man/ModemManager.83
-rw-r--r--src/Makefile.am5
-rw-r--r--src/main.c1
-rw-r--r--src/mm-context.c14
-rw-r--r--src/mm-context.h1
-rw-r--r--src/mm-log.c49
-rw-r--r--src/mm-log.h1
8 files changed, 109 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index c8a35d1b..611677d2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -243,6 +243,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}
diff --git a/docs/man/ModemManager.8 b/docs/man/ModemManager.8
index 72360442..5a74fb26 100644
--- a/docs/man/ModemManager.8
+++ b/docs/man/ModemManager.8
@@ -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
diff --git a/src/Makefile.am b/src/Makefile.am
index 6b29bfe9..402b2ae9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -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
################################################################################
diff --git a/src/main.c b/src/main.c
index c133abc9..b61cabd9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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)) {
diff --git a/src/mm-context.c b/src/mm-context.c
index 0a896e6d..6b0dab79 100644
--- a/src/mm-context.c
+++ b/src/mm-context.c
@@ -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",
@@ -143,6 +151,12 @@ mm_context_get_log_file (void)
}
gboolean
+mm_context_get_log_journal (void)
+{
+ return log_journal;
+}
+
+gboolean
mm_context_get_log_timestamps (void)
{
return log_show_ts;
diff --git a/src/mm-context.h b/src/mm-context.h
index e355692f..143ee15b 100644
--- a/src/mm-context.h
+++ b/src/mm-context.h
@@ -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);
diff --git a/src/mm-log.c b/src/mm-log.c
index fcbef34d..5691b26f 100644
--- a/src/mm-log.c
+++ b/src/mm-log.c
@@ -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;
diff --git a/src/mm-log.h b/src/mm-log.h
index 6c34098e..d9f11f27 100644
--- a/src/mm-log.h
+++ b/src/mm-log.h
@@ -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);