summaryrefslogtreecommitdiff
path: root/src/journal
diff options
context:
space:
mode:
Diffstat (limited to 'src/journal')
-rw-r--r--src/journal/journald-syslog.c29
-rw-r--r--src/journal/journald-syslog.h2
-rw-r--r--src/journal/journald.c1
-rw-r--r--src/journal/journald.h3
4 files changed, 33 insertions, 2 deletions
diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c
index 9db9198a49..d3e0f6f6c1 100644
--- a/src/journal/journald-syslog.c
+++ b/src/journal/journald-syslog.c
@@ -23,12 +23,16 @@
#include <stddef.h>
#include <sys/epoll.h>
+#include "systemd/sd-messages.h"
#include "socket-util.h"
#include "journald.h"
#include "journald-syslog.h"
#include "journald-kmsg.h"
#include "journald-console.h"
+/* Warn once every 30s if we missed syslog message */
+#define WARN_FORWARD_SYSLOG_MISSED_USEC (30 * USEC_PER_SEC)
+
static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, struct ucred *ucred, struct timeval *tv) {
struct msghdr msghdr;
struct cmsghdr *cmsg;
@@ -74,8 +78,10 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned
/* The socket is full? I guess the syslog implementation is
* too slow, and we shouldn't wait for that... */
- if (errno == EAGAIN)
+ if (errno == EAGAIN) {
+ s->n_forward_syslog_missed++;
return;
+ }
if (ucred && errno == ESRCH) {
struct ucred u;
@@ -91,8 +97,10 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned
if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
return;
- if (errno == EAGAIN)
+ if (errno == EAGAIN) {
+ s->n_forward_syslog_missed++;
return;
+ }
}
if (errno != ENOENT)
@@ -464,3 +472,20 @@ int server_open_syslog_socket(Server *s) {
return 0;
}
+
+void server_maybe_warn_forward_syslog_missed(Server *s) {
+ usec_t n;
+ assert(s);
+
+ if (s->n_forward_syslog_missed <= 0)
+ return;
+
+ n = now(CLOCK_MONOTONIC);
+ if (s->last_warn_forward_syslog_missed + WARN_FORWARD_SYSLOG_MISSED_USEC > n)
+ return;
+
+ server_driver_message(s, SD_MESSAGE_FORWARD_SYSLOG_MISSED, "Forwarding to syslog missed %u messages.", s->n_forward_syslog_missed);
+
+ s->n_forward_syslog_missed = 0;
+ s->last_warn_forward_syslog_missed = n;
+}
diff --git a/src/journal/journald-syslog.h b/src/journal/journald-syslog.h
index 8845d28df2..e009ab7e72 100644
--- a/src/journal/journald-syslog.h
+++ b/src/journal/journald-syslog.h
@@ -32,3 +32,5 @@ void server_forward_syslog(Server *s, int priority, const char *identifier, cons
void server_process_syslog_message(Server *s, const char *buf, struct ucred *ucred, struct timeval *tv, const char *label, size_t label_len);
int server_open_syslog_socket(Server *s);
+
+void server_maybe_warn_forward_syslog_missed(Server *s);
diff --git a/src/journal/journald.c b/src/journal/journald.c
index 871bbb636f..74c80f5a08 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -1553,6 +1553,7 @@ int main(int argc, char *argv[]) {
}
server_maybe_append_tags(&server);
+ server_maybe_warn_forward_syslog_missed(&server);
}
log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
diff --git a/src/journal/journald.h b/src/journal/journald.h
index c126d198b1..cd06b40c2f 100644
--- a/src/journal/journald.h
+++ b/src/journal/journald.h
@@ -82,6 +82,9 @@ typedef struct Server {
bool forward_to_syslog;
bool forward_to_console;
+ unsigned n_forward_syslog_missed;
+ usec_t last_warn_forward_syslog_missed;
+
uint64_t cached_available_space;
usec_t cached_available_space_timestamp;