summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2017-09-26 17:45:09 +0200
committerSven Eden <yamakuzure@gmx.net>2017-11-22 08:25:07 +0100
commiteed88c29597329268e5bdcbf192f2133812091c2 (patch)
treec175f1624a12c4d1a05880ab6e81d9c5de8476b1 /src
parent817ce9d4ab8a8f3b0362b4ccdb46c14d669c8a18 (diff)
log: add a mode where we open the log fds for every single log message
This we can then make use in execute.c to make error logging a bit less special when preparing for process execution, as we can still log but don't have any fds open continously.
Diffstat (limited to 'src')
-rw-r--r--src/basic/log.c93
-rw-r--r--src/basic/log.h1
2 files changed, 60 insertions, 34 deletions
diff --git a/src/basic/log.c b/src/basic/log.c
index d34d51847..04d85e7ea 100644
--- a/src/basic/log.c
+++ b/src/basic/log.c
@@ -76,6 +76,7 @@ static bool show_location = false;
static bool upgrade_syslog_to_journal = false;
#endif // 0
static bool always_reopen_console = false;
+static bool open_when_needed = false;
/* Akin to glibc's __abort_msg; which is private and we hence cannot
* use here. */
@@ -599,6 +600,9 @@ int log_dispatch_internal(
if ((level & LOG_FACMASK) == 0)
level = log_facility | LOG_PRI(level);
+ if (open_when_needed)
+ log_open();
+
do {
char *e;
int k = 0;
@@ -656,6 +660,9 @@ int log_dispatch_internal(
buffer = e;
} while (buffer);
+ if (open_when_needed)
+ log_close();
+
return -error;
}
@@ -927,38 +934,48 @@ int log_struct_internal(
level = log_facility | LOG_PRI(level);
#if 0 /// elogind does not support logging to systemd-journald
- if (IN_SET(log_target, LOG_TARGET_AUTO,
- LOG_TARGET_JOURNAL_OR_KMSG,
- LOG_TARGET_JOURNAL) &&
- journal_fd >= 0) {
- char header[LINE_MAX];
- struct iovec iovec[17] = {};
- unsigned n = 0, i;
- int r;
- struct msghdr mh = {
- .msg_iov = iovec,
- };
- bool fallback = false;
-
- /* If the journal is available do structured logging */
- log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL, NULL, NULL);
- iovec[n++] = IOVEC_MAKE_STRING(header);
+ if (IN_SET(log_target,
+ LOG_TARGET_AUTO,
+ LOG_TARGET_JOURNAL_OR_KMSG,
+ LOG_TARGET_JOURNAL)) {
+
+ if (open_when_needed)
+ log_open_journal();
+
+ if (journal_fd >= 0) {
+ char header[LINE_MAX];
+ struct iovec iovec[17] = {};
+ unsigned n = 0, i;
+ int r;
+ struct msghdr mh = {
+ .msg_iov = iovec,
+ };
+ bool fallback = false;
+
+ /* If the journal is available do structured logging */
+ log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL, NULL, NULL);
+ iovec[n++] = IOVEC_MAKE_STRING(header);
+
+ va_start(ap, format);
+ r = log_format_iovec(iovec, ELEMENTSOF(iovec), &n, true, error, format, ap);
+ if (r < 0)
+ fallback = true;
+ else {
+ mh.msg_iovlen = n;
+ (void) sendmsg(journal_fd, &mh, MSG_NOSIGNAL);
+ }
- va_start(ap, format);
- r = log_format_iovec(iovec, ELEMENTSOF(iovec), &n, true, error, format, ap);
- if (r < 0)
- fallback = true;
- else {
- mh.msg_iovlen = n;
- (void) sendmsg(journal_fd, &mh, MSG_NOSIGNAL);
- }
+ va_end(ap);
+ for (i = 1; i < n; i += 2)
+ free(iovec[i].iov_base);
- va_end(ap);
- for (i = 1; i < n; i += 2)
- free(iovec[i].iov_base);
+ if (!fallback) {
+ if (open_when_needed)
+ log_close();
- if (!fallback)
- return -error;
+ return -error;
+ }
+ }
}
#endif // 0
@@ -986,8 +1003,12 @@ int log_struct_internal(
}
va_end(ap);
- if (!found)
+ if (!found) {
+ if (open_when_needed)
+ log_close();
+
return -error;
+ }
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8);
}
@@ -1241,11 +1262,7 @@ void log_received_signal(int level, const struct signalfd_siginfo *si) {
}
-void log_set_upgrade_syslog_to_journal(bool b) {
- upgrade_syslog_to_journal = b;
-}
#endif // 0
-
int log_syntax_internal(
const char *unit,
int level,
@@ -1294,7 +1311,15 @@ int log_syntax_internal(
}
#if 0 /// UNNEEDED by elogind
+void log_set_upgrade_syslog_to_journal(bool b) {
+ upgrade_syslog_to_journal = b;
+}
+
void log_set_always_reopen_console(bool b) {
always_reopen_console = b;
}
#endif // 0
+
+void log_set_open_when_needed(bool b) {
+ open_when_needed = b;
+}
diff --git a/src/basic/log.h b/src/basic/log.h
index 38b71a593..5633a2b42 100644
--- a/src/basic/log.h
+++ b/src/basic/log.h
@@ -311,6 +311,7 @@ void log_received_signal(int level, const struct signalfd_siginfo *si);
void log_set_upgrade_syslog_to_journal(bool b);
void log_set_always_reopen_console(bool b);
#endif // 0
+void log_set_open_when_needed(bool b);
int log_syntax_internal(
const char *unit,