一、入门介绍
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 logginglogging.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 TimedRotatingFileHandlerdef 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 loggerlogger = init("info")logger.info("aaaaaaaaaaaaaaaa")