背景
日志是定位问题和数据分析的关键手段之一,尤其是在调试阶段,高效的、具有辨识度的日志可以非常快速准确的进行问题定位。shell中的echo命令自带文本格式化输出的功能,我们先来回顾下基本的语法,然后套用到python中即可。
shell高亮输出
参考链接:http://www.taodudu.cc/news/show-6319976.html?action=onClick
- 语法:linux系统可以通过man echo来查看
echo命令语法:echo [-ne][字符串] / echo [–help][–version]
支持的可选参数如下:
-n :内容输出完毕后不在末尾加换行
-e 打开反斜杠ESC转义。若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\\ \字符
\a 发出警告声
\b 退格键,也就是删除前一个字符
\c 最后不加上换行符号
\e esc
\f 换行但光标仍旧停留在原来的位置
\n 换行且光标移至行首
\r 光标移至行首,但不换行
\t 插入tab
\0NNN 插入nnn(八进制)所代表的ASCII字符
\xHH 插入hh(十六进制)所代表的ASCII字符
-E :取消反斜杠ESC转义 (默认)
--help:输出帮助信息
--version: 输出版本信息
- echo输出带颜色的文字示例:
echo -e "\033[30m 黑色字\033[0m"
echo -e "\033[31m 红色字\033[0m"
echo -e "\033[32m 绿色字\033[0m"
echo -e "\033[33m 黄色字\033[0m"
echo -e "\033[34m 蓝色字\033[0m"
echo -e "\033[35m 紫色字\033[0m"
echo -e "\033[36m 天蓝色字\033[0m"
echo -e "\033[37m 白色字\033[0m"
#组合设置文本,用分号隔开:白色背景、加粗的绿色字体
echo -e "\033[47;1;32m 绿色字\033[0m"
#也可以使用16进制,esc键对于的ascii码:27(10进制)、0o33(8进制)、0x1b(16进制)
echo -e "\x1b[47;1;32m 绿色字\x1b[0m"
执行结果:
- 【说明】
1、输出带有颜色的文本,必须有"-e"选项,用来启动反斜杠转义的功能;
2、支持的编码如下所示(这些颜色是ANSI标准颜色):
编码 颜色/动作
0 重新设置属性到缺省设置
1 设置粗体
2 设置一半亮度(模拟彩色显示器的颜色)
4 设置下划线(模拟彩色显示器的颜色)
5 设置闪烁
7 设置反向图象
22 设置一般密度
24 关闭下划线
25 关闭闪烁
27 关闭反向图象
30 设置黑色前景
31 设置红色前景
32 设置绿色前景
33 设置黄色前景
34 设置蓝色前景
35 设置紫色前景
36 设置青色前景
37 设置白色(灰色)前景
38 在缺省的前景颜色上设置下划线
39 在缺省的前景颜色上关闭下划线
40 设置黑色背景
41 设置红色背景
42 设置绿色背景
43 设置黄色背景
44 设置蓝色背景
45 设置紫色背景
46 设置青色背景
47 设置白色(灰色)背景
49 设置缺省黑色背景
3、"\033"代表的是键ASCII码的8进制;代表着终端转义字符开始,“m"意味着设置属性然后结束非常规字符序列,
4个例子里真正有效的字符是"47;1;32"和"0”。修改"47;1;32"可以生成不同颜色的组合,数值和编码的前后顺序可以任意指定;
python高亮输出
对应到python代码的话,照猫画虎就大公告成了。
# @Time : 2023/8/27 10:22
# @Author : xiaoxiao
# @File : log.py
"""
基于logging模块的日志工具类
"""
import sys
import logging
import datetime
import inspect
import os
class Logger:
"""log工具类"""
def __init__(self):
self._log_file = "./log.log"
self._logger = logging.getLogger("poc")
self._logger.setLevel(logging.DEBUG)
# self._logger.handlers = []
file_handler = logging.FileHandler(self._log_file)
file_handler.setFormatter(logging.Formatter("%(message)s"))
self._logger.addHandler(hdlr=file_handler)
if "--quiet" in sys.argv or "-q" in sys.argv:
return
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setFormatter(logging.Formatter("%(message)s"))
self._logger.addHandler(hdlr=stream_handler)
# self._logger.propagate = False
def _format_message(self, level, message):
"""格式化将要输出日志信息
:param level: str, 日志等级, INFO/WARN/ERROR/HIGHLIGHT
:param message: str, 日志信息条目
:return: str, 格式化的日志信息条目
"""
frame = inspect.currentframe().f_back.f_back
frame_info = inspect.getframeinfo(frame)
line_no = frame_info.lineno
file_name = frame_info.filename
module_name = os.path.splitext(os.path.split(file_name)[1])[0]
if module_name and line_no:
message = "{time} - [{module}#{line}] - {level} - {message}".format(
time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f')[:-3],
module=module_name, line=line_no, level=level, message=message)
return message
def info(self, message):
self._logger.info(self._format_message("INFO", message))
def warn(self, message):
self._logger.warning(self._format_message("WARN", message))
def error(self, message):
self._logger.error(self._format_message("ERROR", message))
def highlight_red(self, message):
self._logger.info(self._format_message("HIGHLIGHT", "\033[31;1m{}\033[0m".format(message)))
def highlight_green(self, message):
self._logger.info(self._format_message("HIGHLIGHT", "\033[32;1m{}\033[0m".format(message)))
def highlight_yellow(self, message):
self._logger.info(self._format_message("HIGHLIGHT", "\033[33;1m{}\033[0m".format(message)))
if __name__ == "__main__":
logger = Logger()
logger.highlight_red("前方高能预警")
logger.highlight_green("放宽心,一切正常")
logger.highlight_yellow("注意,可能出现异常")
执行结果: