Instead of just being able to log to a file on disk, allow option to
log to systemd's journal.

This can work with or without logging to a file enabled.

Signed-off-by: William Douglas <[email protected]>
---
 configure.ac             | 14 ++++++++++++++
 include/xorg-config.h.in |  3 +++
 os/Makefile.am           |  2 +-
 os/log.c                 | 43 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 68b8762..9b61d7b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -476,6 +476,10 @@ AC_ARG_WITH(module-dir,      
AS_HELP_STRING([--with-module-dir=DIR],
                                  [Directory where modules are installed 
(default: $libdir/xorg/modules)]),
                                [ moduledir="$withval" ],
                                [ moduledir="${libdir}/xorg/modules" ])
+AC_ARG_ENABLE(systemd-logging, AS_HELP_STRING([--enable-systemd-logging],
+                                 [Enable logging with systemd (default: 
disabled)]),
+                               [ SYSTEMD_LOGGING=$enableval ],
+                               [ SYSTEMD_LOGGING=no ])
 AC_ARG_ENABLE(filesystem-logging, 
AS_HELP_STRING([--disable-filesystem-logging],
                                  [Write log messages to the filesystem 
(default: enabled)]),
                                [ FILESYSTEM_LOGGING=$enableval ],
@@ -1487,6 +1491,16 @@ AC_MSG_RESULT([$with_sha1])
 AC_SUBST(SHA1_LIBS)
 AC_SUBST(SHA1_CFLAGS)
 
+AM_CONDITIONAL(SYSTEMD_LOGGING, [test "x$SYSTEMD_LOGGING" = xyes])
+if test "x$SYSTEMD_LOGGING" = xyes; then
+       AC_CHECK_HEADERS([systemd/sd-journal.h], [], AC_MSG_ERROR([systemd 
logging requires libsystemd journal header]))
+       AC_CHECK_HEADERS([syslog.h], [], AC_MSG_ERROR([systemd logging requires 
syslog header]))
+       AC_CHECK_LIB(systemd-journal, sd_journal_send, [], 
AC_MSG_ERROR([systemd logging requires libsystemd journal library]))
+       AC_DEFINE(SYSTEMD_LOGGING, 1, [Use systemd logging])
+       SYSTEMD_LIBS=-lsystemd-journal
+       AC_SUBST(SYSTEMD_LIBS)
+fi
+
 AM_CONDITIONAL(FILESYSTEM_LOGGING, [test "x$FILESYSTEM_LOGGING" = xyes])
 if test "x$FILESYSTEM_LOGGING" = xyes; then
        AC_DEFINE(FILESYSTEM_LOGGING, 1, [Write log messages to the filesystem])
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 93027c5..26a4054 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -142,6 +142,9 @@
 /* Define to 1 if you have the `seteuid' function. */
 #undef HAVE_SETEUID
 
+/* Use systemd logging */
+#undef SYSTEMD_LOGGING
+
 /* Use filesystem logging */
 #undef FILESYSTEM_LOGGING
 
diff --git a/os/Makefile.am b/os/Makefile.am
index 364b6da..6a210a3 100644
--- a/os/Makefile.am
+++ b/os/Makefile.am
@@ -24,7 +24,7 @@ libos_la_SOURCES =    \
        xstrans.c       \
        xprintf.c       \
        $(XORG_SRCS)
-libos_la_LIBADD = @SHA1_LIBS@ $(DLOPEN_LIBS) $(LTLIBOBJS)
+libos_la_LIBADD = @SHA1_LIBS@ $(DLOPEN_LIBS) $(LTLIBOBJS) $(SYSTEMD_LIBS)
 
 if SECURE_RPC
 libos_la_SOURCES += $(SECURERPC_SRCS)
diff --git a/os/log.c b/os/log.c
index 856fa0f..c728c1c 100644
--- a/os/log.c
+++ b/os/log.c
@@ -90,6 +90,13 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #include "site.h"
 #include "opaque.h"
 
+#include <xorg-config.h>
+
+#ifdef SYSTEMD_LOGGING
+#include <syslog.h>
+#include <systemd/sd-journal.h>
+#endif
+
 #ifdef WIN32
 #include <process.h>
 #define getpid(x) _getpid(x)
@@ -108,7 +115,9 @@ void (*OsVendorVErrorFProc) (const char *, va_list args) = 
NULL;
 #endif
 
 static FILE *logFile = NULL;
+static FILE *systemdLogFile = NULL;
 static int logFileFd = -1;
+static int systemdLogFileFd = -1;
 static Bool logFlush = FALSE;
 static Bool logSync = FALSE;
 static int logVerbosity = DEFAULT_LOG_VERBOSITY;
@@ -236,7 +245,24 @@ LogInit(const char *fname, const char *backup)
         }
     }
 #endif
+#ifdef SYSTEMD_LOGGING
+    systemdLogFileFd = sd_journal_stream_fd("X", LOG_INFO, 1);
+    if (systemdLogFileFd < 0)
+        FatalError("Cannot open systemd log file\n");
+    systemdLogFile = fdopen(systemdLogFileFd, "w");
+    if (!systemdLogFile) {
+        close(systemdLogFileFd);
+        FatalError("Cannot open systemd log file object\n");
+    }
 
+    setvbuf(systemdLogFile, NULL, _IONBF, 0);
+
+    /* Flush saved log information. */
+    if (saveBuffer && bufferSize > 0) {
+        fwrite(saveBuffer, bufferPos, 1, systemdLogFile);
+        fflush(systemdLogFile);
+    }
+#endif
     /*
      * Unconditionally free the buffer, and flag that the buffer is no longer
      * needed.
@@ -267,6 +293,15 @@ LogClose(enum ExitCode error)
         logFileFd = -1;
     }
 #endif
+#ifdef SYSTEMD_LOGGING
+    if (systemdLogFile) {
+        ErrorFSigSafe("Server terminated %s (%d). Closing systemd log 
connection.\n",
+               (error == EXIT_NO_ERROR) ? "successfully" : "with error", 
error);
+        fclose(systemdLogFile);
+        systemdLogFile = NULL;
+        systemdLogFileFd = -1;
+    }
+#endif
 }
 
 Bool
@@ -530,6 +565,14 @@ LogSWrite(int verb, const char *buf, size_t len, Bool 
end_line)
             memcpy(saveBuffer + bufferPos, buf, len);
             bufferPos += len;
         }
+        if (inSignalContext && systemdLogFileFd >= 0) {
+            write(systemdLogFileFd, buf, len);
+        }
+        else if (!inSignalContext && systemdLogFile) {
+            fwrite(buf, len, 1, systemdLogFile);
+            if (logFlush)
+                fflush(systemdLogFile);
+        }
     }
 }
 
-- 
1.8.3.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to