Syslog - 如何显示彩色消息?

问题描述 投票:0回答:2

我需要澄清的是我不想给日志输出着色,我只对写入

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脚本(从here抓取):

#!/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

运行此脚本会向我的终端输出一些彩色输出,如下所示:

好了,现在进入实际问题。当我运行该服务时,系统日志输出确实包含转义颜色字符,但未以颜色显示。这是

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)
  • 使用
    multitail
    grc
    rainbow
    实用程序而不是
    tail
bash systemd syslog tail ansi-escape
2个回答
14
投票

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

$EscapeControlCharactersOnReceive off

然后重新启动

rsyslog
和您的服务。

$ systemctl restart rsyslog
$ systemctl restart my_color_service

0
投票

老问题,但为了完整起见,如果您已经用颜色记录了一些东西,并且系统日志已经转义了转义字符,您可以通过将日志传输到 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

© www.soinside.com 2019 - 2024. All rights reserved.