Python项目日志打点功能实现方法

一、入门介绍

1.1 logging和logger的区别

logging和logger是Python的logging模块中的两个关键概念,它们在功能和用途上有明显的区别。
logging是一个Python标准库,是一个用于记录日志的标准模块。它提供了一个灵活的框架,可以用来记录不同级别的日志信息,包括从调试信息到严重错误的信息。logging模块可以配置日志的输出格式、日志级别以及日志的输出位置,如文件、终端、甚至是邮件。
而logger则是logging模块中的一个重要概念,可以理解为是logging模块的一部分。Logger是记录器,是一个具体的日志记录工具。每个Logger都有自己的日志级别,并且可以拥有多个处理器(handler),每个处理器负责处理日志记录的不同部分,例如将日志记录输出到文件或发送到邮件。
总结来说,logging是一个模块,提供了记录日志的框架和功能,而logger是logging模块中的一部分,是具体的日志记录工具。

1.2 logging.basicConfig设置日志级别与logger.setLevel作用一样吗

logging.basicConfig设置的日志级别和logger.setLevel(logging.DEBUG)作用不完全一样。
logging.basicConfig是Python标准库logging模块中的一个函数,用于对logging进行基础的配置,如设置日志级别、输出格式等。其中,日志级别是可以设置的,默认级别为WARNING。但logger.setLevel方法用于设置logger的日志级别,这个设置会影响到该logger以及它所创建的handler的日志级别,默认级别为DEBUG。
因此,虽然logging.basicConfig设置的日志级别和logger.setLevel(logging.DEBUG)都可以用来设置日志级别,但它们的作用范围和影响不同。logging.basicConfig主要影响全局的日志行为,而logger.setLevel主要影响单个logger的行为。
在实际项目使用中,使用logging.basicConfig或使用logger都可以实现对打点日志的规范,二选一即可。

1.3 logging模块提供的Handler类型

  • StreamHandler:将日志消息输出到流对象,如文件、终端等
  • FileHandler:将日志消息写入文件。
  • RotatingFileHandler:将日志消息写入文件,当文件达到一定大小后会自动滚动
  • TimedRotatingFileHandler:将日志消息写入文件,并在指定的时间间隔后滚动
  • SocketHandler:将日志消息发送到网络套接字
  • DatagramHandler:将日志消息发送到UDP套接字
  • SMTPHandler:将日志消息通过电子邮件发送给指定的接收者
  • SysLogHandler:将日志消息发送到系统日志
  • NTEventHandler:将日志消息发送到Windows事件日志
  • HTTPHandler:将日志消息发送到HTTP服务器

二、实际应用代码

2.1 不做任何配置的情况

import logging

logging.warning('Hello World!')  # 在什么都不配置和设定的情况下,logging会简单地将日志打印在显示器上
logging.info('I miss you so much')  # 这行不会被打印,因为级别低于默认级别,默认级别是WARNING

2.2 配置basicConfig将日志输出至文件中

import logging

# 创建logger记录器
logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.warning('Hello World!') 
logging.info('I miss you so much') 

2.3 通过logger实现日志打点功能

import logging
from logging.handlers import TimedRotatingFileHandler

def init(level):
    """
    日志文件的初始化方法
    """
    logger = logging.getLogger("my_logger")
    formatterStr = '[%(asctime)s] [%(threadName)s] [line:%(lineno)d] %(levelname)s: %(message)s'
    log_formatter = logging.Formatter(formatterStr)

    # 控制台日志
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(log_formatter)

    # 用于处理日志文件的滚动
    cur_day = time.strftime('%Y%m%d%H', time.localtime(time.time()))
    log_file = "logs/" + cur_day + ".log"
    info_handler = TimedRotatingFileHandler(filename=log_file,
                                            when='H',
                                            interval=1,
                                            backupCount=10,
                                            encoding='utf-8')
    # 设置文件里写入的格式
    info_handler.setFormatter(log_formatter)

    if level == "debug":
        logger.setLevel(logging.DEBUG)
        console_handler.setLevel(logging.DEBUG)
        info_handler.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)
        console_handler.setLevel(logging.INFO)
        info_handler.setLevel(logging.INFO)

    # 添加日志处理器
    logger.addHandler(console_handler)
    logger.addHandler(info_handler)
    return logger

logger = init("info")

logger.info("aaaaaaaaaaaaaaaa")

你可能感兴趣的:(python,日志打点)