• Python系列:彩色日志详解



    前言

    在使用Python进行编程时,我相信很多小伙伴都有一个共通的习惯,就是不管在什么场景下,都会先使用print()将我们获取到的数据打印出来以此来确保自己的代码没有问题。虽说在pycharm中提供了DEBUG功能,但是还是有很多小伙伴用不来这个或者是不喜欢用,自身还是比较喜欢使用print()来进行打桩验证。

    但是如果我们的Python代码中有很多需要打印出来的数据时,使用print答应出来的数据就会很多,看起来就比较麻烦,那么有什么方法来解决这个问题呢?

    别着急,接着往下看。Python中提供了很多丰富多彩的标准库和支持大量的第三方库,在本篇文章中,我们就会使用到coloredlogs

    coloredlogs介绍

    coloredlogs是一个Python库,它允许开发人员在控制台打印彩色日志。这个库的主要优点是它可以很容易地改变日志消息的颜色,从而使日志更易于阅读和理解。这对于长时间运行的应用程序或者需要详细查看日志信息的情况非常有用。

    coloredlogs库的使用

    1.安装coloredlogs

    在使用前我们需要在Python中下载它

    pip install coloredlogs
    

    2.设置logger日志级别

    首先,在我们记录日志时,需要先设置日志级别和格式

    1. coloredlogs.install(level='DEBUG', fmt='%(asctime)s %(levelname)s %(message)s')

    3.自定义输出样式

    如果我们不结合coloredlogs直接将我们的日志打印到控制台

    1. logging.debug('debug message')
    2. logging.info('info message')
    3. logging.error('error message')
    4. logging.warning('warning message')

    输出到控制的话就只会将error和warning两个级别的日志在控制打印出来,debug和info级别的日志就无法在控制台打印出来,而且显示的两种日志都是一样的颜色并且格式也不好看

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    下面是在我们结合使用coloredlogs后在控制台的输出效果

    1. import coloredlogs
    2. import logging
    3. coloredlogs.install(level='DEBUG', fmt='%(asctime)s %(levelname)s %(message)s')
    4. logging.debug('debug message')
    5. logging.info('info message')
    6. logging.error('error message')
    7. logging.warning('warning message')

    输出效果如下

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    可以很明显的看出,它自动帮我们加上了日志的输出时间和根据不同日志级别显示不一样的颜色来区分,这比我们直接用logging输出要好得多

    4.自定义输出格式

    我们可以在之前添加的输出格式中添加其他的格式内容

    1. import coloredlogs
    2. import logging
    3. def func_name():
    4.     # 增加了modules、funcName两个变量,分辨标识我们日志所在文件以及在哪一个函数中输入的日志
    5.     coloredlogs.install(level='DEBUG', fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    6.     logging.debug('debug message')
    7.     logging.info('info message')
    8.     logging.error('error message')
    9.     logging.warning('warning message')
    10. func_name()

    输出结果如下

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    我们增加了两个变量后,可以方便我们后续寻找问题时就直接定位到了那个文件中的哪个函数出了问题,这是不是就方便我们后面解决问题的效率。

    5.自定义日志级别输出样式

    再上面我们是直接使用了coloredlogs中的默认日志级别颜色样式,同样的我们也可以自定义设置不同日志的显示的样色样式

    1. import coloredlogs
    2. import logging
    3. def fun_name():
    4.     level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
    5.     level_styles['debug'= {'color''magenta'}
    6.     level_styles['info'= {'color''yellow'}
    7.     level_styles['error'= {'color''red'}
    8.     level_styles['warning'= {'color''blue'}
    9.     coloredlogs.install(level="DEBUG", level_styles=level_styles,
    10.                         fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    11.     logging.debug('debug message')
    12.     logging.info('info message')
    13.     logging.error('error message')
    14.     logging.warning('warning message')
    15. fun_name()

    输入样式如下

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    6.写入到日志文件

    上面我们说的是将日志打印到控制台中,但是我们Python代码写完并且在运行当中后,我们就不可能这样玩了,所以我们需要将日志保存到一个日志文件中

    完整代码如下:

    1. import coloredlogs
    2. import logging
    3. def func_name():
    4.     # 创建文件handler
    5.     file_handler = logging.FileHandler('log_file.log')
    6.     # 设置日志格式
    7.     formatter = logging.Formatter('%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    8.     file_handler.setFormatter(formatter)
    9.     # 安装coloredlogs并设置级别
    10.     level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
    11.     coloredlogs.install(level="DEBUG", level_styles=level_styles,
    12.                         fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    13.     # 获取logger 并添加文件handler
    14.     logger = logging.getLogger()
    15.     logger.addHandler(file_handler)
    16.     # 移除默认StreamHandler
    17.     logger.removeHandler(logging.StreamHandler())
    18.     # 测试输出日志
    19.     logger.debug('debug message')
    20.     logger.info('info message')
    21.     logger.error('error message')
    22.     logger.warning('warning message')
    23. func_name()

    打开我们log_file.log文件后,就可以看到我们生成的日志信息

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    可以看到我们生成的日志文件中不同级别的日志还是使用的是一样的颜色。那这是为什么呢?

    其实coloredlogs 库只是在终端输出时给日志添加了颜色,但写入文件时colors并不能保留。

    这是因为终端输出和文件输出使用的是不同的handler:

    • 终端输出使用的是StreamHandler,可以 interpreter 处理ANSI色彩编码显示颜色。

    • 文件输出使用的是FileHandler,写入的仅是纯文本,无法保存ANSI编码的颜色信息。

    ANSI色彩编码只有在支持其的终端才能渲染为颜色,一旦写入文件就会失去这些编码信息。所以使用coloredlogs时,日志文件内实际保存的是未着色的原始文本。

    如果想要文件中也保存颜色信息,可以考虑使用支持ANSI色彩的文件格式,比如HTML。然后通过logging模块支持的HTML Formatter输出彩色日志到HTML文件中,不过这种情况下就失去了纯文本文件的可阅读性。
    综上,coloredlogs只是在终端美化日志展示效果,文件输出不保存颜色是正常情况。如果必须存储颜色,可以输出为HTML等格式,但复杂度会增加。

    如果有小伙伴对写入到html文件感兴趣的,这里我提供我写的一份代码,你们可以拿去自行研究哈~~

    1. import coloredlogs
    2. import logging
    3. from logutils.colorize import ColorizingStreamHandler
    4. import sys
    5. def func_name():
    6.     # 创建一个ColorizingStreamHandler
    7.     color_handler = ColorizingStreamHandler(sys.stdout)
    8.     color_handler.setLevel(logging.DEBUG)
    9.     # 设置格式器
    10.     html_formatter = logging.Formatter('

      %(asctime)s - %(name)s - %(levelname)s - %(message)s

      '
      )
    11.     color_handler.setFormatter(html_formatter)
    12.     # 安装coloredlogs
    13.     coloredlogs.install(level='DEBUG',fmt='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
    14.     # 获取logger并添加handler
    15.     logger = logging.getLogger()
    16.     logger.addHandler(color_handler)
    17.     # 日志输出
    18.     logger.debug('debug message')
    19.     logger.info('info message')
    20.     logger.error('error message')
    21.     logger.warning('warning message')
    22.     # 重定向输出到文件
    23.     with open('log_file.log.html''w') as f:
    24.         old_stdout = sys.stdout
    25.         sys.stdout = f
    26.         logger.debug('debug message')
    27.         logger.info('info message')
    28.         logger.error('error message')
    29.         logger.warning('warning message')
    30.         sys.stdout = old_stdout
    31.     # 关闭默认StreamHandler
    32.     logger.removeHandler(logging.StreamHandler())
    33. func_name()

  • 相关阅读:
    Spring Cloud学习笔记(Hystrix)
    java毕业设计——基于java+MyBatis+jsp的网上招聘系统设计与实现(毕业论文+程序源码)——网上招聘系统
    C++&QT day3
    爬虫项目(四):批量下载高清美女桌面壁纸
    哪种猫罐头比较好?推荐给新手养猫的5款好口碑猫罐头!
    Linux系统之配置Nginx反向代理
    【基础架构】part-1 高可用策略和知识点总结
    Kubernetes2
    CSDN每日一题学习训练——Java版(逆序输出、Z 字形变换、输出每天是应该学习还是休息还是锻炼)
    动态拼接 merge 语句
  • 原文地址:https://blog.csdn.net/Rocky006/article/details/133787951