python命令行or控制台or日志带有颜色的输出
python控制台带颜色输出
在几年前,我写过一个项目,喜欢花里胡哨的我看到别人输出到控制台带有颜色,于是我也想要。
于是乎不知道从哪里搜到的资料,是拼凑起来的颜色代码块。
当时用着没问题,现在用着其实也没问题。但一旦迁移到别的平台设备或者是外部调用的时候,就会出现问题。
早期带有颜色输出的代码如下:
msg = "我是一个有颜色的字体!"
print('\033[0;33m{}'.format(msg))
输出样式如下:
对这种方式感兴趣的小伙伴可以去搜索相关资料,但我建议你真的感兴趣,可以往下继续看!
颜色异常输出示例
用之前颜色代码拼凑输出,通过命令行调用的时候,发现直接输出的是颜色代码,而不是带有颜色的字体。
这里稍微讲解一下。
在终端中设置输出文本的颜色可以使用 ANSI 转义序列来实现。但是,Windows 中的默认控制台不始终支持 ANSI 转义序列,因此可能无法正确显示颜色。
如果在 Windows 上运行这段代码,并且控制台没有正确显示颜色,可以安装第三方库 colorama
来解决此问题。colorama
库是一个跨平台的 Python 模块,可以使在终端中显示 ANSI 转义序列变得更简单。
划重点:跨平台!!!(我已邀请大佬做过测试,windows,mac完美!)
colorma模块的使用
安装
pip install colorama
基本使用
import colorama
from colorama import Fore, Style
# 初始化 colorama 库
colorama.init()
def print_info(msg):
print(Fore.GREEN + msg + Style.RESET_ALL)
通过导入 colorama
库,并使用 Fore.GREEN
来设置文本的前景色为绿色,Style.RESET_ALL
用于重置文本的样式,可以在 Windows 控制台上正确显示颜色。
为了正常显示颜色,确保的控制台支持 ANSI 转义序列或安装了 colorama
库。如果使用的是其他操作系统或终端模拟器,通常可以直接使用 ANSI 转义序列来设置输出的颜色。
封装自己的颜色输出
import colorama
# 初始化 colorama 库
colorama.init()
def print_info(msg: str):
print(colorama.Fore.GREEN + str(msg) + colorama.Style.RESET_ALL)
def print_waring(msg: str):
print(colorama.Fore.YELLOW + str(msg) + colorama.Style.RESET_ALL)
def print_error(msg):
print(colorama.Fore.RED + str(msg) + colorama.Style.RESET_ALL)
这样你想输出哪种颜色就调用哪种颜色就好。
你依旧还是想用print进行输出的话,固定一种颜色可以使用如下代码。
import time
import colorama
_print = print
def print(msg:str):
_print(colorama.Fore.GREEN + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " [mwjApiTest] " + str(msg) + colorama.Style.RESET_ALL)
print("我打印一段文字")
效果如下
可支持的颜色:
BLACK
RED
GREEN
YELLOW
BLUE
MAGENTA
CYAN
WHITE
RESET
# These are fairly well supported, but not part of the standard.
LIGHTBLACK_EX
LIGHTRED_EX
LIGHTGREEN_EX
LIGHTYELLOW_EX
LIGHTBLUE_EX
LIGHTMAGENTA_EX
LIGHTCYAN_EX
LIGHTWHITE_EX
对应输出效果
带有颜色的日志输出
使用colorlog
库
colorlog
是一个方便的 Python 日志库,可以帮助在控制台中添加颜色和样式来美化日志输出。下面是 colorlog
库的使用示例:
- 安装
colorlog
库
pip install colorlog
- 导入
colorlog
import colorlog
- 创建
colorlog
的日志记录器:
logger = colorlog.getLogger()
- 添加控制台处理器:
console_handler = colorlog.StreamHandler()
logger.addHandler(console_handler)
#设置输出等级,这里我不进行设置
logger.setLevel("NOTSET")
- 设置日志记录格式:
log_format = '%(log_color)s%(levelname)s:%(message)s'
console_format = colorlog.ColoredFormatter(log_format)
console_handler.setFormatter(console_format)
- 打印日志:
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
输出样式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGkUMLtS-1692690396784)(images/image-20230730162030148.png)]
通过 colorlog
,可以使用 log_color
变量将颜色和样式应用于日志级别(levelname
)和消息(message
)。可以根据需要自定义日志记录格式。
请注意,在 Windows 上,想要正常显示颜色,需要在使用 colorlog
之前初始化 colorama
来处理 ANSI 转义序列:
import colorama
colorama.init()
以上是 colorlog
库的基本使用示例。可以按照自己的需求使用更高级的日志功能,如添加文件处理器、设置日志级别等。详细的用法可以参考 colorlog
的文档:https://pypi.org/project/colorlog/
实操:编写带颜色输出的单例模式日志器
这段代码可以直接替换自己以前没有颜色输出的日志代码。
class Logger:
__instance = None
# 往屏幕上输出
screen_output = logging.StreamHandler()
def __new__(cls, path=None, level='DEBUG', RotatingFileHandler: BaseRotatingHandler = None):
'''
单列模式
:param path: 报告的路径
:param level: 日志的等级常用,INFO,DEBUG,WARNING,ERROR
:param RotatingFileHandler:
'''
if not cls.__instance:
colorama.init()
cls.__instance = super().__new__(cls)
log = logging.getLogger("mwjApiTest")
# 设置日志级别
log.setLevel(level)
cls.__instance.log = log
if path:
if not os.path.isdir(path):
os.mkdir(path)
if RotatingFileHandler and isinstance(RotatingFileHandler, BaseRotatingHandler):
fh = RotatingFileHandler
else:
# # 往文件里写入#指定间隔时间自动生成文件的处理器
fh = TimedRotatingFileHandler(os.path.join(path, 'mwjApiTest.log'), when='D', interval=1,
backupCount=7, encoding='utf-8')
fh.setLevel(level)
cls.__instance.log.addHandler(fh)
# 定义handler的输出格式
formatter = logging.Formatter("%(levelname)-8s%(asctime)s%(name)s:%(filename)s:%(lineno)d %(message)s")
fh.setFormatter(formatter)
return cls.__instance
def set_level(self, level):
"""设置日志输出的等级"""
self.log.setLevel(level)
#### 设置输出的颜色
def fontColor(self):
# 不同的日志输出不同的颜色
formatter = colorlog.ColoredFormatter(
'%(log_color)s[%(asctime)s] [%(name)s] [%(levelname)s]: %(message)s',
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
},
)
self.screen_output.setFormatter(formatter)
self.log.addHandler(self.screen_output)
测试
aa = Logger()
aa.debug('This is a debug message')
aa.info('This is an info message')
aa.warning('This is a warning message')
aa.error('This is an error message')
aa.critical('This is a critical message')
结束!
后续希望我更新什么可以在后台留言哦 ~
公众号:梦无矶的测试开发之路