[2603] | 1 | From 7eefa90ac1422825db6f1bbbe4e66f1336fca531 Mon Sep 17 00:00:00 2001 |
---|
| 2 | From: Alexander Chernyakhovsky <achernya@mit.edu> |
---|
| 3 | Date: Thu, 28 Aug 2014 22:51:21 -0400 |
---|
| 4 | Subject: [PATCH] Redirect stderr to systemd-journald |
---|
| 5 | |
---|
| 6 | Scripts provides the "logview" facility for users to be able to see |
---|
| 7 | the error logs from their applications. However, this facility |
---|
| 8 | requires running the moral equivalent of grep $USER error_log. Not all |
---|
| 9 | error messages contain the username, and therefore, the logview |
---|
| 10 | facility is unreliable at best. |
---|
| 11 | |
---|
| 12 | Additionally, the error_log contains an interleaving of all errors, |
---|
| 13 | which makes it difficult for system administrators to help withs |
---|
| 14 | upport requests in which an Internal Server Error has been |
---|
| 15 | experienced. |
---|
| 16 | |
---|
| 17 | Since systemd-journald supports per-user journals, replace stderr, |
---|
| 18 | which is provided by Apache, with a file descriptor pointing to the |
---|
| 19 | journal. Assuming that journald is configured to split the log on |
---|
| 20 | UIDs, this will allow journalctl --user to show each individual user |
---|
| 21 | their error logs. |
---|
| 22 | --- |
---|
| 23 | support/Makefile.in | 7 ++++++- |
---|
| 24 | support/suexec.c | 21 +++++++++++++++++++++ |
---|
| 25 | 2 files changed, 27 insertions(+), 1 deletion(-) |
---|
| 26 | |
---|
| 27 | diff --git a/support/Makefile.in b/support/Makefile.in |
---|
| 28 | index 745d86c..4014c1f 100644 |
---|
| 29 | --- a/support/Makefile.in |
---|
| 30 | +++ b/support/Makefile.in |
---|
| 31 | @@ -73,8 +73,13 @@ checkgid: $(checkgid_OBJECTS) |
---|
| 32 | $(LINK) $(checkgid_LTFLAGS) $(checkgid_OBJECTS) $(PROGRAM_LDADD) |
---|
| 33 | |
---|
| 34 | suexec_OBJECTS = suexec.lo |
---|
| 35 | +suexec_LDADD = "-lsystemd-journal -lsystemd-id128" |
---|
| 36 | +suexec.lo: suexec.c |
---|
| 37 | + $(LIBTOOL) --mode=compile $(CC) $(ab_CFLAGS) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ |
---|
| 38 | + $(ALL_INCLUDES) $(PICFLAGS) $(LTCFLAGS) -DSCRIPTS_HAVE_SYSTEMD_JOURNAL \ |
---|
| 39 | + -c $< && touch $@ |
---|
| 40 | suexec: $(suexec_OBJECTS) |
---|
| 41 | - $(LINK) $(suexec_OBJECTS) |
---|
| 42 | + $(LINK) $(suexec_OBJECTS) $(suexec_LDADD) |
---|
| 43 | |
---|
| 44 | htcacheclean_OBJECTS = htcacheclean.lo |
---|
| 45 | htcacheclean: $(htcacheclean_OBJECTS) |
---|
| 46 | diff --git a/support/suexec.c b/support/suexec.c |
---|
| 47 | index 3a4d802..4fe4c44 100644 |
---|
| 48 | --- a/support/suexec.c |
---|
| 49 | +++ b/support/suexec.c |
---|
| 50 | @@ -61,6 +61,11 @@ |
---|
| 51 | #include <grp.h> |
---|
| 52 | #endif |
---|
| 53 | |
---|
| 54 | +#ifdef SCRIPTS_HAVE_SYSTEMD_JOURNAL |
---|
| 55 | +#include <systemd/sd-journal.h> |
---|
| 56 | +#include <systemd/sd-daemon.h> |
---|
| 57 | +#endif |
---|
| 58 | + |
---|
| 59 | #ifdef AP_LOG_SYSLOG |
---|
| 60 | #include <syslog.h> |
---|
| 61 | #endif |
---|
| 62 | @@ -769,6 +774,22 @@ TRUSTED_DIRECTORY: |
---|
| 63 | umask(AP_SUEXEC_UMASK); |
---|
| 64 | #endif /* AP_SUEXEC_UMASK */ |
---|
| 65 | |
---|
| 66 | +#ifdef SCRIPTS_HAVE_SYSTEMD_JOURNAL |
---|
| 67 | + int fd = sd_journal_stream_fd("CGI Script", LOG_NOTICE, 0); |
---|
| 68 | + if (fd < 0) { |
---|
| 69 | + log_err("unable to open systemd-journald file descriptor\n"); |
---|
| 70 | + exit(254); |
---|
| 71 | + } |
---|
| 72 | + if (dup2(fd, STDERR_FILENO) < 0) { |
---|
| 73 | + log_err("unable to make journald file descriptor available as stderr\n"); |
---|
| 74 | + exit(253); |
---|
| 75 | + } |
---|
| 76 | + if (close(fd) < 0) { |
---|
| 77 | + log_err("unable to close journald file descriptor copy\n"); |
---|
| 78 | + exit(252); |
---|
| 79 | + } |
---|
| 80 | +#endif /* SCRIPTS_HAVE_SYSTEMD_JOURNAL */ |
---|
| 81 | + |
---|
| 82 | /* Be sure to close the log file so the CGI can't mess with it. */ |
---|
| 83 | #ifdef AP_LOG_SYSLOG |
---|
| 84 | if (log_open) { |
---|
| 85 | -- |
---|
| 86 | 1.8.5.2 (Apple Git-48) |
---|
| 87 | |
---|