Syslog - 如何显示带颜色的消息?

7

我需要澄清的是,我不想着色日志输出,我只对写入syslog的程序输出感兴趣。

这是场景,我有一个systemd单元服务运行一个脚本,在Bash中指示256种颜色。

以下是服务单元文件:

[Unit]
Description=Bash Color Service

[Service]
Type=simple
EnvironmentFile=/etc/environment
ExecStart=/home/username/colors.sh

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=bashcolors

Restart=on-failure
RestartSec=10

User=username
Group=username

[Install]
WantedBy=multi-user.target

以下是位于/home/username/colors.sh的Bash脚本(从这里获取):

#!/bin/bash

# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.

for fgbg in 38 48 ; do # Foreground / Background
    for color in {0..255} ; do # Colors
        # Display the color
        printf "\e[${fgbg};5;%sm  %3s  \e[0m" $color $color
        # Display 6 colors per lines
        if [ $((($color + 1) % 6)) == 4 ] ; then
            echo # New line
        fi
    done
    echo # New line
done

exit 0

运行这个脚本会在我的终端上输出一些彩色的内容,就像这样:enter image description here 好的,现在来说实际的问题。当我运行服务时,系统日志输出确实包含了转义颜色字符,但是并没有以彩色显示。以下是tail -f /var/log/syslog输出的相关信息片段:
bashcolor[19892]: #033[48;5;202m  202  #033[0m#033[48;5;203m  203  #033[0m#033[48;5;204m  204  #033[0m#033[48;5;205m  205  #033[0m#033[48;5;206m  206  #033[0m#033[48;5;207m  207  #033[0m
bashcolor[19892]: #033[48;5;208m  208  #033[0m#033[48;5;209m  209  #033[0m#033[48;5;210m  210  #033[0m#033[48;5;211m  211  #033[0m#033[48;5;212m  212  #033[0m#033[48;5;213m  213  #033[0m
bashcolor[19892]: #033[48;5;214m  214  #033[0m#033[48;5;215m  215  #033[0m#033[48;5;216m  216  #033[0m#033[48;5;217m  217  #033[0m#033[48;5;218m  218  #033[0m#033[48;5;219m  219  #033[0m
bashcolor[19892]: #033[48;5;220m  220  #033[0m#033[48;5;221m  221  #033[0m#033[48;5;222m  222  #033[0m#033[48;5;223m  223  #033[0m#033[48;5;224m  224  #033[0m#033[48;5;225m  225  #033[0m
bashcolor[19892]: #033[48;5;226m  226  #033[0m#033[48;5;227m  227  #033[0m#033[48;5;228m  228  #033[0m#033[48;5;229m  229  #033[0m#033[48;5;230m  230  #033[0m#033[48;5;231m  231  #033[0m
bashcolor[19892]: #033[48;5;232m  232  #033[0m#033[48;5;233m  233  #033[0m#033[48;5;234m  234  #033[0m#033[48;5;235m  235  #033[0m#033[48;5;236m  236  #033[0m#033[48;5;237m  237  #033[0m
bashcolor[19892]: #033[48;5;238m  238  #033[0m#033[48;5;239m  239  #033[0m#033[48;5;240m  240  #033[0m#033[48;5;241m  241  #033[0m#033[48;5;242m  242  #033[0m#033[48;5;243m  243  #033[0m
bashcolor[19892]: #033[48;5;244m  244  #033[0m#033[48;5;245m  245  #033[0m#033[48;5;246m  246  #033[0m#033[48;5;247m  247  #033[0m#033[48;5;248m  248  #033[0m#033[48;5;249m  249  #033[0m
bashcolor[19892]: #033[48;5;250m  250  #033[0m#033[48;5;251m  251  #033[0m#033[48;5;252m  252  #033[0m#033[48;5;253m  253  #033[0m#033[48;5;254m  254  #033[0m#033[48;5;255m  255  #033[0m

迄今为止我尝试过的方法:

  • 使用ccze实用程序:tail -f /var/log/syslog | ccze -A
  • echo -ne $(tail -f /var/log/syslog)
  • 使用multitailgrcrainbow实用程序代替tail

注意:本文中涉及的HTML标签已保留。
2个回答

14

syslog默认会转义ansi的颜色代码 [1]。若要启用,请添加以下内容到/etc/rsyslog.conf

$EscapeControlCharactersOnReceive off

然后重启rsyslog和您的服务。

$ systemctl restart rsyslog
$ systemctl restart my_color_service

1
就是这样!非常简单,非常感谢。正是我想要的东西。 - user3707763

1

这是一个老问题,但为了完整起见,如果您已经使用颜色记录了某些内容,并且syslog已经转义了转义字符,您可以通过将日志传输到sed命令中来在终端上为记录的日志添加颜色:

tail /var/log/syslog | sed 's/#033/\x1b/g'

解释:

所有颜色变化都是通过控制序列定义的,这些控制序列以十六进制\x1b(转义字符)开头。Syslog已经转义了转义字符并将它们转换为#033,因为在八进制系统中\033表示相同的字符。您可以通过将任何#033更改为\x1b来撤消该操作。

演示 输入图像说明


这里还有一个关于该主题的不错介绍:https://chrisyeh96.github.io/2020/03/28/terminal-colors.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接