[gdm] daemon: let the xserver log to the journal
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] daemon: let the xserver log to the journal
- Date: Mon, 27 Jan 2014 21:06:27 +0000 (UTC)
commit ed7b9505a4f8ea90f0bf540b5ed8c24d9ffd66ad
Author: Peter Hutterer <peter hutterer who-t net>
Date: Thu Jan 23 10:16:01 2014 +1000
daemon: let the xserver log to the journal
If systemd is running, don't re-route the xserver's stdout/stderr to a log
file. Instead hook it up to a journal stream and let the xserver log to the
journal.
gdm thus starts the server with:
Xorg <other options> -logfile /dev/null -verbose 3
where 3 is the default Xorg log verbosity.
Minor changes by Ray Strode.
https://bugzilla.gnome.org/show_bug.cgi?id=722889
daemon/gdm-server.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 65 insertions(+), 6 deletions(-)
---
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index 91a04e6..7ad73aa 100644
--- a/daemon/gdm-server.c
+++ b/daemon/gdm-server.c
@@ -43,6 +43,14 @@
#include <linux/vt.h>
#endif
+#ifdef WITH_SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
+
+#ifdef ENABLE_SYSTEMD_JOURNAL
+#include <systemd/sd-journal.h>
+#endif
+
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <gio/gio.h>
@@ -243,6 +251,7 @@ gdm_server_init_command (GdmServer *server)
{
gboolean debug = FALSE;
const char *debug_options;
+ const char *verbosity = "";
if (server->priv->command != NULL) {
return;
@@ -275,6 +284,15 @@ gdm_server_init_command (GdmServer *server)
goto fallback;
}
+#ifdef ENABLE_SYSTEMD_JOURNAL
+ /* For systemd, we don't have a log file but instead log to stdout,
+ so set it to the xserver's built-in default verbosity */
+ if (debug)
+ verbosity = "7 -logfile /dev/null";
+ else
+ verbosity = "3 -logfile /dev/null";
+#endif
+
if (g_access (SYSTEMD_X_SERVER, X_OK) < 0) {
goto fallback;
}
@@ -284,13 +302,13 @@ gdm_server_init_command (GdmServer *server)
goto fallback;
}
- server->priv->command = g_strdup_printf (SYSTEMD_X_SERVER " -background none -verbose%s",
debug_options);
+ server->priv->command = g_strdup_printf (SYSTEMD_X_SERVER " -background none -verbose %s%s",
verbosity, debug_options);
return;
fallback:
#endif
- server->priv->command = g_strdup_printf (X_SERVER " -background none -verbose%s", debug_options);
+ server->priv->command = g_strdup_printf (X_SERVER " -background none -verbose %s%s", verbosity,
debug_options);
}
static gboolean
@@ -451,12 +469,44 @@ change_user (GdmServer *server)
}
}
+static gboolean
+gdm_server_setup_journal_fds (GdmServer *server)
+{
+#ifdef ENABLE_SYSTEMD_JOURNAL
+ if (sd_booted () > 0) {
+ int out, err;
+ const char *prefix = "gdm-Xorg-";
+ char *identifier;
+ gsize size;
+
+ size = strlen (prefix) + strlen (server->priv->display_name) + 1;
+ identifier = g_alloca (size);
+ strcpy (identifier, prefix);
+ strcat (identifier, server->priv->display_name);
+ identifier[size - 1] = '\0';
+
+ out = sd_journal_stream_fd (identifier, LOG_INFO, FALSE);
+ if (out < 0)
+ return FALSE;
+
+ err = sd_journal_stream_fd (identifier, LOG_WARNING, FALSE);
+ if (err < 0) {
+ close (out);
+ return FALSE;
+ }
+
+ VE_IGNORE_EINTR (dup2 (out, 1));
+ VE_IGNORE_EINTR (dup2 (err, 2));
+ return TRUE;
+ }
+ return FALSE;
+#endif
+}
+
static void
-server_child_setup (GdmServer *server)
+gdm_server_setup_logfile (GdmServer *server)
{
int logfd;
- struct sigaction ign_signal;
- sigset_t mask;
char *log_file;
char *log_path;
@@ -467,7 +517,6 @@ server_child_setup (GdmServer *server)
/* Rotate the X server logs */
rotate_logs (log_path, MAX_LOGS);
- /* Log all output from spawned programs to a file */
g_debug ("GdmServer: Opening logfile for server %s", log_path);
VE_IGNORE_EINTR (g_unlink (log_path));
@@ -484,6 +533,16 @@ server_child_setup (GdmServer *server)
"gdm_server_spawn",
server->priv->display_name);
}
+}
+
+static void
+server_child_setup (GdmServer *server)
+{
+ struct sigaction ign_signal;
+ sigset_t mask;
+
+ if (!gdm_server_setup_journal_fds(server))
+ gdm_server_setup_logfile(server);
/* The X server expects USR1/TTIN/TTOU to be SIG_IGN */
ign_signal.sa_handler = SIG_IGN;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]