python loguru日志模块使用

相比于logging模块,loguru模块使用起来更方便,并且可以根据不同日志级别,进行不同颜色输出

一、安装

pip install loguru

二、基本使用

  • 代码

    from loguru import logger
    
    # logger.add(sys.stderr) 内部已默认执行,输出日志内容到控制台
    # logger.remove(0)  #删除默认处理程序的配置(其ID为0)
    # logger.add(sys.stderr, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name} | {line} | {message}") # 重新添加控制台日志输出格式
    
    logger.add('test.log', encoding='utf-8', level='ERROR') # level参数指定ERROR及以上级别的日志输出到日志文件,不指则默认全部输出
    logger.info('info')
    logger.debug('debug')
    logger.warning('warning')
    logger.error('error')
    logger.critical('critical')
  • 控制台输出

  • test.log文件

    2023-01-12 04:47:57.788 | ERROR    | __main__:<module>:24 - error
    2023-01-12 04:47:57.788 | CRITICAL | __main__:<module>:25 - critical

    按照设置的日志级别,只保存了ERROR及以上级别日志内容

三、配置使用

  • 概述

    • 使用logger.add()方法就可以实现日志输出的配置,类比logging模块的handler
    • 默认已经实现了logger.add(sys.stderr)方法,即控制台输出的handler,可通过logger.remove()方法清除已添加的handler
  • rotation参数(

    • 按照指定规则生成新的日志文件,避免单个日志文件过大
      logger.add('./logs/test.log', encoding='utf-8', rotation='5 MB') # 文件超过5MB,就会新生成一个文件
      logger.add('./logs/test.log', encoding='utf-8', rotation='1 week') # 一周后,会新生成一个文件,单位还可以是s等
      logger.add('./logs/test.log', encoding='utf-8', rotation='00:00') # 每天的00:00生成新文件(注意:如果该时间段没有日志记录,则仍记录在原日志文件)
    • 取值示例:"100 MB", "0.5 GB", "1 month 2 weeks", "4 days", "10h", "monthly", "18:00", "sunday", "w0", "monday at 12:00", ...
    • 示例
      import time
      from loguru import logger
      
      logger.add('./logs/test_{time}.log', encoding='utf-8', rotation='10 s') # 超过10s,则新建日志
      for i in range(30):
          logger.info(f'test_{i}')
          time.sleep(1)

      运行结束后,生成3个日志文件,{time}会生成当前的时间

  • retention参数(

    • 按照指定规则保留日志(即删除操作)
      logger.add('./logs/test.log', encoding='utf-8', retention='10 days') # 只保留最近10天的日志内容,旧文件则自动删除
      logger.add('./logs/test.log', rotation='5 MB', retention='1 week') # 只保留最近1周的文件
      logger.add('./logs/test.log', encoding='utf-8', rotation='5 MB', retention=2) # 只保留最近3个文件

      注意:retention取整数时,保留最近【int + 1】个文件

    • 示例
      from loguru import logger
      logger.add('./logs/test.log', encoding='utf-8', rotation='1 KB', retention=2)
      
      for i in range(100):
          logger.info(f'test_{i}')

      当日志文件大小超过1 KB时,会新生成日志文件,同时旧的日志文件名会带上时间,最后保留最新的3个日志文件

  • format参数

    • 可以自定义日志的格式
    • 使用示例:
      • 代码
        import sys
        from loguru import logger
        
        logger.remove(0) # 取消默认处理方式
        # 日志级别和消息级别按照对应颜色进行转换,其余使用绿色,{thread.name} => 线程名
        format_ = '<g>{time:YYYY-MM-DD HH:mm:ss} |</g> <lvl>{level}</lvl> <g>| {name} | {line} | {thread.name} -</g> <lvl>{message}</lvl>'
        logger.add(sys.stderr, format=format_)
        
        logger.info('info')
        logger.debug('debug')
        logger.warning('warning')
        logger.error('error')
        logger.critical('critical')
      • 控制台输出
    • 常见的key及其描述:
      +------------+---------------------------------+----------------------------+
      | Key        | Description                     | Attributes                 |
      +============+=================================+============================+
      | elapsed    | 程序开始以来经过的时间                   | 参见|timedelta|             |
      +------------+---------------------------------+----------------------------+
      | exception  | 如果有异常则为格式化后的异常,否则为``None`` | ``type``, ``value``, ``traceback`` |
      +------------+---------------------------------+----------------------------+
      | extra      | 用户绑定的属性字典(参见|bind|)           | None                       |
      +------------+---------------------------------+----------------------------+
      | file       | 进行日志调用的文件                     | ``name`` (默认), ``path``    |
      +------------+---------------------------------+----------------------------+
      | function   | 进行日志调用的函数                     | None                       |
      +------------+---------------------------------+----------------------------+
      | level      | 用于记录消息的严重程度                   | ``name`` (默认), ``no``, ``icon`` |
      +------------+---------------------------------+----------------------------+
      | line       | 源代码中的行号                        | None                       |
      +------------+---------------------------------+----------------------------+
      | message    | 记录的消息(尚未格式化)                   | None                       |
      +------------+---------------------------------+----------------------------+
      | module     | 进行日志调用的模块                     | None                       |
      +------------+---------------------------------+----------------------------+
      | name       | 进行日志调用的``__name__``            | None                       |
      +------------+---------------------------------+----------------------------+
      | process    | 进行日志调用的进程                     | ``name``, ``id`` (默认)    |
      +------------+---------------------------------+----------------------------+
      | thread     | 进行日志调用的线程                     | ``name``, ``id`` (默认)    |
      +------------+---------------------------------+----------------------------+
      | time       | 进行日志调用时的本地时间                   | 参见|datetime|             |
      +------------+---------------------------------+----------------------------+
    • 常见的颜色标签
      以下是可用的标签(请注意,根据终端的兼容性可能会有所不同):
      
      +------------------------------------+--------------------------------------+
      | 颜色(简称)                       | 样式(简称)                         |
      +====================================+======================================+
      | 黑色(k)                          | 粗体(b)                             |
      +------------------------------------+--------------------------------------+
      | 蓝色(e)                           | 暗淡(d)                              |
      +------------------------------------+--------------------------------------+
      | 青色(c)                           | 正常(n)                           |
      +------------------------------------+--------------------------------------+
      | 绿色(g)                          | 斜体(i)                           |
      +------------------------------------+--------------------------------------+
      | 洋红色(m)                        | 下划线(u)                        |
      +------------------------------------+--------------------------------------+
      | 红色(r)                            | 删除线(s)                           |
      +------------------------------------+--------------------------------------+
      | 白色(w)                          | 反转(v)                          |
      +------------------------------------+--------------------------------------+
      | 黄色(y)                         | 闪烁(l)                            |
      +------------------------------------+--------------------------------------+
      |                                    | 隐藏(h)                             |
      +------------------------------------+--------------------------------------+
      
      用法:
      
      +-----------------+-------------------------------------------------------------------+
      | 描述            | 示例                                                              |
      |                 +---------------------------------+---------------------------------+
      |                 | 前景色                            | 背景色                           |
      +=================+=================================+=================================+
      | 基本颜色        | ``<red>``, ``<r>``              | ``<GREEN>``, ``<G>``            |
      +-----------------+---------------------------------+---------------------------------+
      | 浅色            | ``<light-blue>``, ``<le>``      | ``<LIGHT-CYAN>``, ``<LC>``      |
      +-----------------+---------------------------------+---------------------------------+
      | 8位颜色         | ``<fg 86>``, ``<fg 255>``       | ``<bg 42>``, ``<bg 9>``         |
      +-----------------+---------------------------------+---------------------------------+
      | 十六进制颜色    | ``<fg #00005f>``, ``<fg #EE1>`` | ``<bg #AF5FD7>``, ``<bg #fff>`` |
      +-----------------+---------------------------------+---------------------------------+
      | RGB颜色         | ``<fg 0,95,0>``                 | ``<bg 72,119,65>``              |
      +-----------------+---------------------------------+---------------------------------+
      | 样式化          | ``<bold>``, ``<b>``,  ``<underline>``, ``<u>``                    |
      +-----------------+-------------------------------------------------------------------+

      特殊标签``<level>``(用``<lvl>``缩写)根据配置的日志消息级别颜色进行转换。

  • compression参数

    • 对日志文件进行压缩,节省空间
      from loguru import logger
      
      logger.add('./logs/test.log', encoding='utf-8', rotation='10KB', compression='zip')
      for i in range(1000):
          logger.info(f'test_{i}')

      上述示例中,首先日志文件超过10KB就会新建日志文件,然后对之前的文件进行zip压缩,压缩后大小为1KB

    • 可选压缩格式有:gz、bz2、xz、lzma、tar、tar.gz、tar.bz2、tar.xz、zip
  • filter参数

    • 可以过滤不同类型的日志,输出指定类型日志到指定文件
      from loguru import logger
      
      # 设置不同级别的日志输出文件
      logger.add("debug.log", level="DEBUG", rotation="10 MB", filter=lambda record: record["level"].name == "DEBUG")
      logger.add("info.log", level="INFO", rotation="10 MB", filter=lambda record: record["level"].name == "INFO")
      logger.add("warning.log", level="WARNING", rotation="10 MB", filter=lambda record: record["level"].name == "WARNING")
      logger.add("error.log", level="ERROR", rotation="10 MB", filter=lambda record: record["level"].name == "ERROR")
      logger.add("critical.log", level="CRITICAL", rotation="10 MB", filter=lambda record: record["level"].name == "CRITICAL")
      
      # 输出不同级别的日志消息
      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")

四、异常追溯(不终止程序运行,即不会raise)

  • 方式一:装饰器@logger.catch

    • 代码

      from loguru import logger
      
      
      @logger.catch
      def run():
          test()
      
      
      def test():
          print(3 / 0)
      
      
      if __name__ == "__main__":
          run()
    • 控制台输出

  • 方式二:logger.exception

    • 代码

      from loguru import logger
      
      def test():
          try:
              print(3 / 0)
          except ZeroDivisionError as e:
              logger.exception(e)
      
      if __name__ == "__main__":
          test()
    • 控制台输出

posted @ 2023-01-13 23:40  eliwang  阅读(1563)  评论(0编辑  收藏  举报