[sheepdog] [PATCH] logger: colorize logger output when stdout is console
Liu Yuan
namei.unix at gmail.com
Wed Mar 13 07:42:25 CET 2013
On 03/12/2013 11:14 PM, MORITA Kazutaka wrote:
> With this patch, the logger output will be readable and, in addition,
> we can easily review the log level of each output.
>
> Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> ---
> collie/collie.c | 2 +-
> collie/collie.h | 3 ---
> collie/treeview.c | 3 ---
> include/util.h | 21 +++++++++++++++++++++
> lib/logger.c | 40 +++++++++++++++++++++++++++++++++++-----
> 5 files changed, 57 insertions(+), 12 deletions(-)
>
> diff --git a/collie/collie.c b/collie/collie.c
> index 4f5e974..08c78eb 100644
> --- a/collie/collie.c
> +++ b/collie/collie.c
> @@ -380,7 +380,7 @@ int main(int argc, char **argv)
> }
> }
>
> - if (!isatty(STDOUT_FILENO) || raw_output)
> + if (!is_stdout_console() || raw_output)
> highlight = false;
>
> if (flags & SUBCMD_FLAG_NEED_NODELIST) {
> diff --git a/collie/collie.h b/collie/collie.h
> index 7e9b6be..d8c65d4 100644
> --- a/collie/collie.h
> +++ b/collie/collie.h
> @@ -25,9 +25,6 @@
> #define SUBCMD_FLAG_NEED_NODELIST (1 << 0)
> #define SUBCMD_FLAG_NEED_THIRD_ARG (1 << 1)
>
> -#define TEXT_NORMAL "\033[0m"
> -#define TEXT_BOLD "\033[1m"
> -
> #define UINT64_DECIMAL_SIZE 21
>
> struct command {
> diff --git a/collie/treeview.c b/collie/treeview.c
> index cb3bd87..2910170 100644
> --- a/collie/treeview.c
> +++ b/collie/treeview.c
> @@ -20,9 +20,6 @@
> #define MAX_DEPTH 100
> #endif
>
> -#define TEXT_NORMAL "\033[0m"
> -#define TEXT_BOLD "\033[1m"
> -
> struct vdi_tree {
> char name[1024];
> char label[256];
> diff --git a/include/util.h b/include/util.h
> index eae4e9a..5a72bd1 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -131,4 +131,25 @@ static inline void uatomic_set_false(uatomic_bool *val)
> uatomic_set(&val->val, 0);
> }
>
> +/* colors */
> +#define TEXT_NORMAL "\033[0m"
> +#define TEXT_BOLD "\033[1m"
> +#define TEXT_RED "\033[0;31m"
> +#define TEXT_BOLD_RED "\033[1;31m"
> +#define TEXT_GREEN "\033[0;32m"
> +#define TEXT_BOLD_GREEN "\033[1;32m"
> +#define TEXT_YELLOW "\033[0;33m"
> +#define TEXT_BOLD_YELLOW "\033[1;33m"
> +#define TEXT_BLUE "\033[0;34m"
> +#define TEXT_BOLD_BLUE "\033[1;34m"
> +#define TEXT_MAGENTA "\033[0;35m"
> +#define TEXT_BOLD_MAGENTA "\033[1;35m"
> +#define TEXT_CYAN "\033[0;36m"
> +#define TEXT_BOLD_CYAN "\033[1;36m"
> +
> +static inline bool is_stdout_console(void)
> +{
> + return isatty(STDOUT_FILENO);
> +}
> +
> #endif
> diff --git a/lib/logger.c b/lib/logger.c
> index e48471d..15b6880 100644
> --- a/lib/logger.c
> +++ b/lib/logger.c
> @@ -38,6 +38,18 @@
> #include "logger.h"
> #include "util.h"
>
> +static bool colorize;
> +static const char *log_color[] = {
> + [SDOG_EMERG] = TEXT_BOLD_RED,
> + [SDOG_ALERT] = TEXT_BOLD_RED,
> + [SDOG_CRIT] = TEXT_BOLD_RED,
> + [SDOG_ERR] = TEXT_BOLD_RED,
> + [SDOG_WARNING] = TEXT_BOLD_YELLOW,
> + [SDOG_NOTICE] = TEXT_BOLD_CYAN,
> + [SDOG_INFO] = TEXT_CYAN,
> + [SDOG_DEBUG] = TEXT_GREEN,
> +};
> +
> struct logger_user_info *logger_user_info;
>
> static void dolog(int prio, const char *func, int line, const char *fmt,
> @@ -205,22 +217,37 @@ static notrace int default_log_formatter(char *buff, size_t size,
> strftime(p, size, "%b %2d %H:%M:%S ", (const struct tm *)&tm);
> p += strlen(p);
>
> + if (colorize) {
> + pstrcpy(p, size - strlen(buff), TEXT_YELLOW);
> + p += strlen(p);
> + }
> +
> if (worker_name_len && msg->worker_idx)
> - snprintf(p, size, "[%s %d] ", msg->worker_name,
> - msg->worker_idx);
> + snprintf(p, size - strlen(buff), "[%s %d] ", msg->worker_name,
> + msg->worker_idx);
> else if (worker_name_len)
> - snprintf(p, size, "[%s] ", msg->worker_name);
> + snprintf(p, size - strlen(buff), "[%s] ", msg->worker_name);
> else
> - pstrcpy(p, size, "[main] ");
> + pstrcpy(p, size - strlen(buff), "[main] ");
>
> p += strlen(p);
>
> snprintf(p, size - strlen(buff), "%s(%d) ", msg->func, msg->line);
> p += strlen(p);
>
> + if (colorize) {
> + pstrcpy(p, size - strlen(buff), log_color[msg->prio]);
> + p += strlen(p);
> + }
> +
> snprintf(p, size - strlen(buff), "%s", (char *)msg->str);
> p += strlen(p);
>
> + if (colorize) {
> + pstrcpy(p, size - strlen(buff), "\033[m");
> + p += strlen(p);
> + }
> +
> return p - buff;
> }
> log_format_register("default", default_log_formatter);
> @@ -569,7 +596,10 @@ notrace int log_init(const char *program_name, int size, bool to_stdout,
>
> semkey = random();
>
> - if (!to_stdout) {
> + if (to_stdout) {
> + if (is_stdout_console())
> + colorize = true;
> + } else {
> if (logarea_init(size)) {
> syslog(LOG_ERR, "failed to initialize the logger\n");
> return 1;
>
Applied, thanks.
Yuan
More information about the sheepdog
mailing list