我需要澄清的是我不想给日志输出着色,我只对写入
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
到目前为止我尝试过的事情:
syslog
默认转义 ansi 颜色代码 [1]。要启用将以下内容添加到/etc/rsyslog.conf
$EscapeControlCharactersOnReceive off
然后重新启动
rsyslog
和您的服务。
$ systemctl restart rsyslog
$ systemctl restart my_color_service
老问题,但为了完整起见,如果您已经用颜色记录了一些东西,并且系统日志已经转义了转义字符,您可以通过将日志传输到 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