X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald-console.c;h=4afa6ef9c3bb410741d79d0a6f4d12bc107de05d;hb=8ee8e53648bf45854d92b60e1e70c17a0cec3c3d;hp=be55f94878a03821f5565b238855aef4dc72f3f5;hpb=f274ece0f76b5709408821e317e87aef76123db6;p=elogind.git diff --git a/src/journal/journald-console.c b/src/journal/journald-console.c index be55f9487..4afa6ef9c 100644 --- a/src/journal/journald-console.c +++ b/src/journal/journald-console.c @@ -19,24 +19,43 @@ along with systemd; If not, see . ***/ +#include #include #include #include +#include "fileio.h" #include "journald-server.h" #include "journald-console.h" +static bool prefix_timestamp(void) { + + static int cached_printk_time = -1; + + if (_unlikely_(cached_printk_time < 0)) { + _cleanup_free_ char *p = NULL; + + cached_printk_time = + read_one_line_file("/sys/module/printk/parameters/time", &p) >= 0 + && parse_boolean(p) > 0; + } + + return cached_printk_time; +} + void server_forward_console( Server *s, int priority, const char *identifier, const char *message, - struct ucred *ucred) { + const struct ucred *ucred) { - struct iovec iovec[4]; + struct iovec iovec[5]; char header_pid[16]; + struct timespec ts; + char tbuf[4 + DECIMAL_STR_MAX(ts.tv_sec) + DECIMAL_STR_MAX(ts.tv_nsec)-3 + 1]; int n = 0, fd; - char *ident_buf = NULL; + _cleanup_free_ char *ident_buf = NULL; const char *tty; assert(s); @@ -45,14 +64,23 @@ void server_forward_console( if (LOG_PRI(priority) > s->max_level_console) return; - /* First: identifier and PID */ + /* First: timestamp */ + if (prefix_timestamp()) { + assert_se(clock_gettime(CLOCK_MONOTONIC, &ts) == 0); + snprintf(tbuf, sizeof(tbuf), "[%5"PRI_TIME".%06ld] ", + ts.tv_sec, + ts.tv_nsec / 1000); + IOVEC_SET_STRING(iovec[n++], tbuf); + } + + /* Second: identifier and PID */ if (ucred) { if (!identifier) { get_process_comm(ucred->pid, &ident_buf); identifier = ident_buf; } - snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid); + snprintf(header_pid, sizeof(header_pid), "["PID_FMT"]: ", ucred->pid); char_array_0(header_pid); if (identifier) @@ -64,7 +92,7 @@ void server_forward_console( IOVEC_SET_STRING(iovec[n++], ": "); } - /* Third: message */ + /* Fourth: message */ IOVEC_SET_STRING(iovec[n++], message); IOVEC_SET_STRING(iovec[n++], "\n"); @@ -72,15 +100,12 @@ void server_forward_console( fd = open_terminal(tty, O_WRONLY|O_NOCTTY|O_CLOEXEC); if (fd < 0) { - log_debug("Failed to open %s for logging: %s", tty, strerror(errno)); - goto finish; + log_debug_errno(errno, "Failed to open %s for logging: %m", tty); + return; } if (writev(fd, iovec, n) < 0) - log_debug("Failed to write to %s for logging: %s", tty, strerror(errno)); - - close_nointr_nofail(fd); + log_debug_errno(errno, "Failed to write to %s for logging: %m", tty); -finish: - free(ident_buf); + safe_close(fd); }