logging 模块

logging 模块

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
level=logging.INFO
设置记录级别为INFO,意味着会记录INFO、WARNING、ERROR和CRITICAL级别的日志,DEBUG级别的会被忽略

format参数
定义日志输出格式:

%(asctime)s:记录时间(如:2023-08-01 12:00:00,000)
%(levelname)s:日志级别(如:INFO、ERROR)
%(message)s:日志内容
handlers数组
包含两个输出渠道:
FileHandler:将日志写入当前目录的crawler.log文件(使用UTF-8编码)
StreamHandler:将日志实时输出到控制台
实际效果:
程序运行时既会在控制台实时显示日志,又会将日志永久保存到crawler.log文件中,格式示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# logg.py
import logging
from logging.handlers import RotatingFileHandler

# 日志配置函数
def setup_logger(log_file='app.log'):
logger = logging.getLogger() # logging,getLogger() 获取一个 logger 实例作用是获取一个日志记录器 如果logging,getLogger()不赋值logger,则默认返回root logger
logger.setLevel(logging.INFO) # 下面自己设置了日志级别这里可以不用设置吗?:可以不用设置,因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志

# 控制台输出
console_handler = logging.StreamHandler() # 创建一个控制台输出处理器
console_handler.setLevel(logging.INFO) # 上面已经设置了日志级别为什么这里还要设置:因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志
console_format = logging.Formatter('[%(levelname)s] %(message)s') # 设置日志格式
console_handler.setFormatter(console_format)

# 文件输出(带轮转)
file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=3) # 创建一个文件输出处理器,最大1MB,最多保留3个旧文件
file_handler.setLevel(logging.INFO)
file_format = logging.Formatter('%(asctime)s - %(name)s - [%(levelname)s] - %(message)s') # 设置日志格式
file_handler.setFormatter(file_format)

# 添加处理器,作用是日志输出到控制台和文件
logger.addHandler(console_handler) # 为什么return logger 就可以打印日志:因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志
logger.addHandler(file_handler)

return logger
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# main.py
from logg import setup_logger

# 初始化 logger
logger = setup_logger()

def main():
logger.info("程序开始运行")
logger.warning("这是一个警告")
logger.error("出现了一个错误")
logger.critical("严重错误!")

if __name__ == "__main__":
main()

定义日志格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import logging

# 创建日志格式
formatter = logging.Formatter('[%(asctime)s] %(levelname)s - %(message)s')

# 创建 info 日志处理器
info_handler = logging.FileHandler('info.log', encoding='utf-8')
info_handler.setLevel(logging.INFO)
info_handler.setFormatter(formatter)

# 创建 warning 日志处理器
warning_handler = logging.FileHandler('warning.log', encoding='utf-8')
warning_handler.setLevel(logging.WARNING)
warning_handler.setFormatter(formatter)

# 创建 error 日志处理器
error_handler = logging.FileHandler('error.log', encoding='utf-8')
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(formatter)

# 创建控制台输出处理器
# console_handler = logging.StreamHandler()
# console_handler.setLevel(logging.INFO)
# console_handler.setFormatter(formatter)

# 配置 root logger(主日志器)
logging.basicConfig(
level=logging.INFO,
handlers=[info_handler, warning_handler, error_handler]
# handlers=[info_handler, warning_handler, error_handler, console_handler]
)

# === 模拟日志输出 ===
logging.info("程序启动,初始化成功。")
logging.warning("警告:配置文件中某些值未设置,将使用默认值。")
logging.error("错误:无法连接到数据库,请检查配置。")