loguru日志模块使用

loguru日志模块使用 

 

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

一、安装

pip install loguru

二、基本使用

  • 代码

    from loguru import logger
    
    # logger.add(sys.stderr) 内部已默认执行,输出日志内容到控制台
    logger.add('test.log', encoding='utf-8', level='ERROR') # 将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='17:44') # 每天的17:44生成新文件(注意:如果该时间段没有日志记录,则仍记录在原日志文件)
    • 示例
      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', 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个日志文件

  • 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

四、异常追溯

  • 代码

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

from loguru import logger


@logger.catch
def add(x, y, z):
    return 1 / (x + y + z)


# logger.remove()  # 取消注释将不会打印到控制台上
logger.add("debug.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="DEBUG",
           filter=lambda x: "DEBUG" in str(x['level']).upper())
logger.add("info.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="INFO",
           filter=lambda x: "INFO" in str(x['level']).upper())
logger.add("error.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="ERROR",
           filter=lambda x: "ERROR" in str(x['level']).upper())
logger.add("warning.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file}: {line}: {function}] | {message}", level="WARNING",
           filter=lambda x: "WARNING" in str(x['level']).upper())

if __name__ == '__main__':
    # trace = logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")
    logger.info("That's it, beautiful and simple logging!")
    logger.debug("debug")
    logger.warning("This is new log")
    logger.info(f'If you are using Python {__file__}, prefer {__file__} of course!')
    add(0, 0, 0)
    logger.success("nice")

 

posted @ 2023-02-27 14:02  小学弟-  阅读(200)  评论(0编辑  收藏  举报