[PATCH 5/5] log: Add support for journal logging
Aleksander Morgado
aleksander at aleksander.es
Wed Jun 21 11:35:53 UTC 2017
On 21/06/17 12:59, Torsten Hilbrich wrote:
> 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.
Pushed to git master, thanks.
> ---
> configure.ac | 35 +++++++++++++++++++++++++++++++++++
> docs/man/ModemManager.8 | 3 +++
> src/Makefile.am | 5 +++++
> src/main.c | 1 +
> src/mm-context.c | 14 ++++++++++++++
> src/mm-context.h | 1 +
> src/mm-log.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/mm-log.h | 1 +
> 8 files changed, 109 insertions(+)
>
> diff --git a/configure.ac b/configure.ac
> index c8a35d1..611677d 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 7236044..5a74fb2 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 6b29bfe..402b2ae 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 c133abc..b61cabd 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 0a896e6..6b0dab7 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 e355692..143ee15 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 fcbef34..5691b26 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 6c34098..d9f11f2 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);
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list