]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/log: use colors to highlight messages like journalctl
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 26 Apr 2019 10:27:33 +0000 (12:27 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 8 May 2019 07:45:38 +0000 (09:45 +0200)
src/basic/log.c
src/basic/terminal-util.c
src/basic/terminal-util.h
src/shared/logs-show.c

index ea252c41302fb6fd9d0b29d9853a3c9f9a760f2d..a81c350ab4d3ca1945920b426c4b64aeb9af20f9 100644 (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) {
index b692c52e590f0829b04e8b6bdf501552043b3da0..4676ce2a8066957b65561138ee86c2eadd3e3c1f 100644 (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;
+        }
+}
index c885e0a2d1a014dea069f46cf5e5e1d1537999e4..f3e785e7ba327ad25e8a2c7266cb27c6362fd3b0 100644 (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);
index 5fb736f63307ab4e2e02973a2d8d8118ed7188b5..bdde6c11e388df022c3b4f741789978a47402d45 100644 (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. */