|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT PATCH 3/5] lib/ukdebug: Option for colored output format
Hi Simon,
This patch looks good, thanks.
Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx>
On Mon, Sep 14, 2020 at 2:48 PM Simon Kuenzer <simon.kuenzer@xxxxxxxxx> wrote:
>
> Colors! This commit makes use of ANSI control sequences to color console
> output when activated by the user configuration.
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> lib/ukdebug/Config.uk | 8 ++++
> lib/ukdebug/print.c | 85 +++++++++++++++++++++++++++++++++++++------
> 2 files changed, 82 insertions(+), 11 deletions(-)
>
> diff --git a/lib/ukdebug/Config.uk b/lib/ukdebug/Config.uk
> index 799593b8..e4177bec 100644
> --- a/lib/ukdebug/Config.uk
> +++ b/lib/ukdebug/Config.uk
> @@ -73,6 +73,14 @@ config LIBUKDEBUG_PRINT_SRCNAME
> bool "Print source code location of messages"
> default y
>
> +config LIBUKDEBUG_ANSI_COLOR
> + bool "Colored output"
> + default n
> + help
> + Use ANSI control sequences to colorize console output.
> + Before activating this option, please make sure that
> + your console output/display supports ANSI.
> +
> config LIBUKDEBUG_ENABLE_ASSERT
> bool "Enable assertions"
> default y
> diff --git a/lib/ukdebug/print.c b/lib/ukdebug/print.c
> index 1a12898e..6dbcda06 100644
> --- a/lib/ukdebug/print.c
> +++ b/lib/ukdebug/print.c
> @@ -45,6 +45,44 @@
> #include <uk/errptr.h>
> #include <uk/arch/lcpu.h>
>
> +#if CONFIG_LIBUKDEBUG_ANSI_COLOR
> +#define LVLC_RESET UK_ANSI_MOD_RESET
> +#define LVLC_TS UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_GREEN)
> +#define LVLC_SP UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_BLUE)
> +#define LVLC_LIBNAME UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_YELLOW)
> +#define LVLC_SRCNAME UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_CYAN)
> +#define LVLC_DEBUG UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_WHITE)
> +#define LVLC_KERN UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_BLUE)
> +#define LVLC_INFO UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_GREEN)
> +#define LVLC_WARN UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_YELLOW)
> +#define LVLC_ERROR UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED)
> +#define LVLC_ERROR_MSG UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED)
> +#define LVLC_CRIT UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_WHITE) \
> + UK_ANSI_MOD_COLORBG(UK_ANSI_COLOR_RED)
> +
> +#define LVLC_CRIT_MSG UK_ANSI_MOD_BOLD \
> + UK_ANSI_MOD_COLORFG(UK_ANSI_COLOR_RED)
> +#else
> +#define LVLC_RESET ""
> +#define LVLC_TS ""
> +#define LVLC_SP ""
> +#define LVLC_LIBNAME ""
> +#define LVLC_SRCNAME ""
> +#define LVLC_DEBUG ""
> +#define LVLC_KERN ""
> +#define LVLC_INFO ""
> +#define LVLC_WARN ""
> +#define LVLC_ERROR ""
> +#define LVLC_ERROR_MSG ""
> +#define LVLC_CRIT ""
> +#define LVLC_CRIT_MSG ""
> +#endif /* !CONFIG_LIBUKDEBUG_ANSI_COLOR */
> +
> #define BUFLEN 192
> /* special level for printk redirection, used internally only */
> #define KLVL_DEBUG (-1)
> @@ -81,7 +119,8 @@ static void _print_timestamp(struct _vprint_console *cons)
> __nsec rem_usec = ukarch_time_subsec(nansec);
>
> rem_usec = ukarch_time_nsec_to_usec(rem_usec);
> - len = __uk_snprintf(buf, BUFLEN, "[%5" __PRInsec ".%06" __PRInsec "]
> ",
> + len = __uk_snprintf(buf, BUFLEN, LVLC_RESET LVLC_TS
> + "[%5" __PRInsec ".%06" __PRInsec "] ",
> sec, rem_usec);
> cons->cout((char *)buf, len);
> }
> @@ -96,7 +135,8 @@ static void _print_stack(struct _vprint_console *cons)
>
> stackb = (ukarch_read_sp() & STACK_MASK_TOP) + __STACK_SIZE;
>
> - len = __uk_snprintf(buf, BUFLEN, "<%p> ", (void *) stackb);
> + len = __uk_snprintf(buf, BUFLEN, LVLC_RESET LVLC_SP
> + "<%p> ", (void *) stackb);
> cons->cout((char *)buf, len);
> }
> #endif
> @@ -113,21 +153,25 @@ static void _vprint(struct _vprint_console *cons,
> const char *lptr = NULL;
> const char *nlptr = NULL;
>
> + /*
> + * Note: We reset the console colors earlier in order to exclude
> + * background colors for trailing white spaces.
> + */
> switch (lvl) {
> case KLVL_DEBUG:
> - msghdr = "dbg: ";
> + msghdr = LVLC_RESET LVLC_DEBUG "dbg:" LVLC_RESET " ";
> break;
> case KLVL_CRIT:
> - msghdr = "CRIT: ";
> + msghdr = LVLC_RESET LVLC_CRIT "CRIT:" LVLC_RESET " ";
> break;
> case KLVL_ERR:
> - msghdr = "ERR: ";
> + msghdr = LVLC_RESET LVLC_ERROR "ERR:" LVLC_RESET " ";
> break;
> case KLVL_WARN:
> - msghdr = "Warn: ";
> + msghdr = LVLC_RESET LVLC_WARN "Warn:" LVLC_RESET " ";
> break;
> case KLVL_INFO:
> - msghdr = "Info: ";
> + msghdr = LVLC_RESET LVLC_INFO "Info:" LVLC_RESET " ";
> break;
> default:
> /* unknown type: ignore */
> @@ -153,12 +197,13 @@ static void _vprint(struct _vprint_console *cons,
> #if CONFIG_LIBUKDEBUG_PRINT_TIME
> _print_timestamp(cons);
> #endif
> - cons->cout(DECONST(char *, msghdr), 6);
> + cons->cout(DECONST(char *, msghdr), strlen(msghdr));
> #if CONFIG_LIBUKDEBUG_PRINT_STACK
> _print_stack(cons);
> #endif
> if (libname) {
> - cons->cout("[", 1);
> + cons->cout(LVLC_RESET LVLC_LIBNAME "[",
> + strlen(LVLC_RESET LVLC_LIBNAME) +
> 1);
> cons->cout(DECONST(char *, libname),
> strlen(libname));
> cons->cout("] ", 2);
> @@ -167,13 +212,15 @@ static void _vprint(struct _vprint_console *cons,
> if (srcname) {
> char lnobuf[6];
>
> + cons->cout(LVLC_RESET LVLC_SRCNAME "<",
> + strlen(LVLC_RESET LVLC_SRCNAME) +
> 1);
> cons->cout(DECONST(char *, srcname),
> strlen(srcname));
> cons->cout(" @ ", 3);
> cons->cout(lnobuf,
> __uk_snprintf(lnobuf,
> sizeof(lnobuf),
> - "%-5u", srcline));
> - cons->cout(": ", 2);
> + "%4u", srcline));
> + cons->cout("> ", 2);
> }
> #endif
> cons->newline = 0;
> @@ -186,7 +233,23 @@ static void _vprint(struct _vprint_console *cons,
> } else {
> llen = len;
> }
> +
> + /* Message body */
> + switch (lvl) {
> + case KLVL_CRIT:
> + cons->cout(LVLC_RESET LVLC_CRIT_MSG,
> + strlen(LVLC_RESET LVLC_CRIT_MSG));
> + break;
> + case KLVL_ERR:
> + cons->cout(LVLC_RESET LVLC_ERROR_MSG,
> + strlen(LVLC_RESET LVLC_ERROR_MSG));
> + break;
> + default:
> + cons->cout(LVLC_RESET, strlen(LVLC_RESET));
> + }
> cons->cout((char *)lptr, llen);
> + cons->cout(LVLC_RESET, strlen(LVLC_RESET));
> +
> len -= llen;
> lptr = nlptr + 1;
> }
> --
> 2.20.1
>
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |