basic/log: use colors to highlight messages like journalctl

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-04-26 12:27:33 +02:00
parent e608bf6f7f
commit 37b8d2f699
4 changed files with 42 additions and 21 deletions

View file

@ -336,7 +336,7 @@ static int write_to_console(
char location[256], prefix[1 + DECIMAL_STR_MAX(int) + 2];
struct iovec iovec[6] = {};
bool highlight;
const char *on = NULL, *off = NULL;
size_t n = 0;
if (console_fd < 0)
@ -347,18 +347,19 @@ static int write_to_console(
iovec[n++] = IOVEC_MAKE_STRING(prefix);
}
highlight = LOG_PRI(level) <= LOG_ERR && show_color;
if (show_color)
get_log_colors(LOG_PRI(level), &on, &off, NULL);
if (show_location) {
(void) snprintf(location, sizeof location, "(%s:%i) ", file, line);
iovec[n++] = IOVEC_MAKE_STRING(location);
}
if (highlight)
iovec[n++] = IOVEC_MAKE_STRING(ANSI_HIGHLIGHT_RED);
if (on)
iovec[n++] = IOVEC_MAKE_STRING(on);
iovec[n++] = IOVEC_MAKE_STRING(buffer);
if (highlight)
iovec[n++] = IOVEC_MAKE_STRING(ANSI_NORMAL);
if (off)
iovec[n++] = IOVEC_MAKE_STRING(off);
iovec[n++] = IOVEC_MAKE_STRING("\n");
if (writev(console_fd, iovec, n) < 0) {

View file

@ -1310,3 +1310,33 @@ int vt_release(int fd, bool restore) {
return 0;
}
void get_log_colors(int priority, const char **on, const char **off, const char **highlight) {
/* Note that this will initialize output variables only when there's something to output.
* The caller must pre-initalize to "" or NULL as appropriate. */
if (priority <= LOG_ERR) {
if (on)
*on = ANSI_HIGHLIGHT_RED;
if (off)
*off = ANSI_NORMAL;
if (highlight)
*highlight = ANSI_HIGHLIGHT;
} else if (priority <= LOG_NOTICE) {
if (on)
*on = ANSI_HIGHLIGHT;
if (off)
*off = ANSI_NORMAL;
if (highlight)
*highlight = ANSI_HIGHLIGHT_RED;
} else if (priority >= LOG_DEBUG) {
if (on)
*on = ANSI_GREY;
if (off)
*off = ANSI_NORMAL;
if (highlight)
*highlight = ANSI_HIGHLIGHT_RED;
}
}

View file

@ -4,6 +4,7 @@
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <syslog.h>
#include <sys/types.h>
#include "macro.h"
@ -158,3 +159,5 @@ int vt_default_utf8(void);
int vt_reset_keyboard(int fd);
int vt_restore(int fd);
int vt_release(int fd, bool restore_vt);
void get_log_colors(int priority, const char **on, const char **off, const char **highlight);

View file

@ -163,21 +163,8 @@ static bool print_multiline(
bool ellipsized = false;
int line = 0;
if (flags & OUTPUT_COLOR) {
if (priority <= LOG_ERR) {
color_on = ANSI_HIGHLIGHT_RED;
color_off = ANSI_NORMAL;
highlight_on = ANSI_HIGHLIGHT;
} else if (priority <= LOG_NOTICE) {
color_on = ANSI_HIGHLIGHT;
color_off = ANSI_NORMAL;
highlight_on = ANSI_HIGHLIGHT_RED;
} else if (priority >= LOG_DEBUG) {
color_on = ANSI_GREY;
color_off = ANSI_NORMAL;
highlight_on = ANSI_HIGHLIGHT_RED;
}
}
if (flags & OUTPUT_COLOR)
get_log_colors(priority, &color_on, &color_off, &highlight_on);
/* A special case: make sure that we print a newline when
the message is empty. */