if (n == 0)
return;
+ if (LOG_PRI(priority) > s->max_level_store)
+ return;
+
if (!ucred)
goto finish;
log_debug("Failed to forward syslog message: %m");
}
-static void forward_syslog_raw(Server *s, const char *buffer, struct ucred *ucred, struct timeval *tv) {
+static void forward_syslog_raw(Server *s, int priority, const char *buffer, struct ucred *ucred, struct timeval *tv) {
struct iovec iovec;
assert(s);
assert(buffer);
+ if (LOG_PRI(priority) > s->max_level_syslog)
+ return;
+
IOVEC_SET_STRING(iovec, buffer);
forward_syslog_iovec(s, &iovec, 1, ucred, tv);
}
assert(priority <= 999);
assert(message);
+ if (LOG_PRI(priority) > s->max_level_syslog)
+ return;
+
/* First: priority field */
snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
char_array_0(header_priority);
assert(priority <= 999);
assert(message);
+ if (LOG_PRI(priority) > s->max_level_kmsg)
+ return;
+
/* Never allow messages with kernel facility to be written to
* kmsg, regardless where the data comes from. */
priority = fixup_priority(priority);
free(ident_buf);
}
-static void forward_console(Server *s, const char *identifier, const char *message, struct ucred *ucred) {
+static void forward_console(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
struct iovec iovec[4];
char header_pid[16];
int n = 0, fd;
assert(s);
assert(message);
+ if (LOG_PRI(priority) > s->max_level_console)
+ return;
+
/* First: identifier and PID */
if (ucred) {
if (!identifier) {
unsigned n = 0;
int priority = LOG_USER | LOG_INFO;
char *identifier = NULL, *pid = NULL;
+ const char *orig;
assert(s);
assert(buf);
+ orig = buf;
+ parse_syslog_priority((char**) &buf, &priority);
+
if (s->forward_to_syslog)
- forward_syslog_raw(s, buf, ucred, tv);
+ forward_syslog_raw(s, priority, orig, ucred, tv);
- parse_syslog_priority((char**) &buf, &priority);
skip_syslog_date((char**) &buf);
read_identifier(&buf, &identifier, &pid);
forward_kmsg(s, priority, identifier, buf, ucred);
if (s->forward_to_console)
- forward_console(s, identifier, buf, ucred);
+ forward_console(s, priority, identifier, buf, ucred);
IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=syslog");
forward_kmsg(s, priority, identifier, message, ucred);
if (s->forward_to_console)
- forward_console(s, identifier, message, ucred);
+ forward_console(s, priority, identifier, message, ucred);
}
dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, priority);
forward_kmsg(s->server, priority, s->identifier, p, &s->ucred);
if (s->forward_to_console || s->server->forward_to_console)
- forward_console(s->server, s->identifier, p, &s->ucred);
+ forward_console(s->server, priority, s->identifier, p, &s->ucred);
IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=stdout");
static int process_event(Server *s, struct epoll_event *ev) {
assert(s);
+ assert(ev);
if (ev->data.fd == s->signal_fd) {
struct signalfd_siginfo sfsi;
if (sfsi.ssi_signo == SIGUSR1) {
server_flush_to_var(s);
- return 0;
+ return 1;
+ }
+
+ if (sfsi.ssi_signo == SIGUSR2) {
+ server_rotate(s);
+ server_vacuum(s);
+ return 1;
}
log_debug("Received SIG%s", signal_to_string(sfsi.ssi_signo));
assert(s);
assert_se(sigemptyset(&mask) == 0);
- sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, -1);
+ sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1);
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
s->forward_to_syslog = true;
s->import_proc_kmsg = true;
+ s->max_level_store = LOG_DEBUG;
+ s->max_level_syslog = LOG_DEBUG;
+ s->max_level_kmsg = LOG_NOTICE;
+ s->max_level_console = LOG_INFO;
+
memset(&s->system_metrics, 0xFF, sizeof(s->system_metrics));
memset(&s->runtime_metrics, 0xFF, sizeof(s->runtime_metrics));