美文网首页
python—log&loguru

python—log&loguru

作者: 小二哥很二 | 来源:发表于2021-04-13 16:30 被阅读0次

一、Log:之前写了一篇python log模块的笔记,但是写了又忘记,回头去看又蒙圈。最近在写项目,于是又复习回顾了一遍,更加的系统:

整体来说,遵循以下几个步骤,就不混乱了:

  • 创建日志器logger = logging.getLogger(),初始化
  • 创建控制台处理器StreamHandler
  • 定义格式器处理器,包括终端打印&写入文件时候的格式,为全局格式
  • 将日志器logger放到控制台处理器
  • 将格式器放到控制台处理器
    一定遵循创建了handler,就添加一次formatter和handler,以免混乱

代码如下:

import logging
import os
from logging.handlers import TimedRotatingFileHandler

log_path = os.path.dirname(os.path.abspath('.')) + "\\logs\\"
# file_info_name = os.path.join(log_path, "info", "info.log")
# print(file_info_name)

class Logger(object):

    # 初始化,am可以不填写
    logger = logging.getLogger("am")
    # 清除logger,避免多个文件引用重复打印log
    logger.handlers.clear()
    # 设置log等级
    logger.setLevel(logging.DEBUG)
    backup_count = 5
    formatter = logging.Formatter('[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s')

    # 设置控制台
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    # 给handler添加formatter
    console_handler.setFormatter(formatter)
    # 给logger添加handler
    logger.addHandler(console_handler)

    # 文件--Info
    file_info_name = os.path.join(log_path, "info", "info.log")
    file_info_handler = logging.handlers.TimedRotatingFileHandler(filename=file_info_name, when='D',
                                                                  interval=1, backupCount=backup_count,
                                                                  encoding='utf-8')
    file_info_handler.setLevel(logging.INFO)
    # 给handler添加formatter
    file_info_handler.setFormatter(formatter)
    # 给logger添加handler
    logger.addHandler(file_info_handler)

    # 文件--Error
    file_error_name = os.path.join(log_path, "error", "error.log")
    file_error_handler = logging.handlers.TimedRotatingFileHandler(filename=file_error_name, when='D',
                                                                   interval=1, backupCount=backup_count,
                                                                   encoding='utf-8')
    file_error_handler.setLevel(logging.ERROR)
    file_error_handler.setFormatter(formatter)
    logger.addHandler(file_error_handler)

    def info(self, msg, *args, **kwargs):
        self.logger.info(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        self.logger.error(msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        self.logger.warning(msg, *args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        self.logger.exception(msg, *args, exc_info, **kwargs)

PS:虽然上面写了不同等级输出文件不同,但是info文件里的日志最全,包含更高等级的日志内容

二、loguru:log模块使用起来要做很多操作,而loguru就使日志更加的简单优美

from loguru import logger


# 使用装饰器,方便在配置不完善的情况下记录traceback
@logger.catch()
def test(x, y, z):
    """
    rotation:{time}.log可以生成标准时间,可以设置大小rotation = 500 MB
                每天0点生成一个log文件:rotation = ”00:00“
                一周生成一个文件:rotation = ”1 week“
    retention:代表日志文件最长保留多少天:10 days,1 week,2 months
    :return:
    """
    # trace = logger.add('runtime_{time}.log', rotation="500 MB")
    # {time}.log可以根据格式化的时间命名日志文件
    # logger.add('runtime_{time}.log', rotation="500 MB", retention="10 days")
    logger.add('loguru.log', rotation="500 MB", retention="10 days")
    logger.info('I love u very much')

    # logger.remove(xx),可以删除日志不写入日志文件
    # logger.remove(trace)
    logger.debug('this is another debug message')

    # 字符串格式化输出
    logger.error('If you are using Python {}, prefer {feature} of course!', 3.7, feature='f-string')

    return 1 / (x + y + z)


test(0, 0, 0)

输出示意图:


终端日志打印

※注意:虽然loguru简洁优美,但是小二我还没找到loguru设置日志保存时间等更多的方法介绍,大家可自行百度或官网学习

相关文章

网友评论

      本文标题:python—log&loguru

      本文链接:https://www.haomeiwen.com/subject/gbrclltx.html