LOgging库介绍:
logging库是Python内置的日志处理库,在输出运行信息比print更灵活,可控。
核心概念:
1.日志级别(从高到低,默认值输出warning以及以上的级别):
--DEBUG: 调试信息(变量值,函数调用细节)
--INFO:普通运行信息(程序成功启动,确认流程正常)
--WARNING:警告错误(不影响运行)
--ERROR:错误信息(文件读取时便,功能部分受阻)
--CRITICAL:严重错误(数据库连接失败,程序无法继续运行)
2.四大组件:
--Logger:日志入口(用户直接调用的接口)
--Handler:日志输出目标
--Formatter:日志格式
--Filter:日志过滤
使用方法:
1.直接输出不同级别的日志:
import logging
# 输出不同级别的日志
logging.debug('调试信息')#级别低于WARRNING,默认不进行打印
logging.info('程序运行信息') #级别低于WARRNING,默认不进行打印
logging.warning('警告错误i') #默认打印
logging.error('错误信息')
logging.critical('严重错误')
输出结果:

2.基础配置
使用logging.basicConfig()配置日志的级别,格式,输出位置等(必须在输出日志前调用):
basicConfig()主要参数:
--level:设置日志的最低输出级别(例如:level = logging.debug,表示输出debug以及以上所有的级别日志)
--format:指定输出格式(例如:
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s')
输出结果:
常用格式占位符
%(asctime)s:日志记录的时间(默认格式为YYYY-MM-DD HH:MM:SS,mmm)。%(levelname)s:日志级别(如INFO、ERROR)。%(message)s:日志的具体内容(即logging.info("内容")中的 “内容”)。%(name)s:日志器的名称(默认是root,即根日志器)。%(filename)s:产生日志的文件名。%(lineno)d:产生日志的代码行号
--datefmt:自定义 %(asctime)s 的时间格式(需配合 format 使用)。
logging.basicConfig(
format='%(asctime)s - %(message)s',
datefmt='%Y/%m/%d %H:%M:%S' # 时间格式改为“年/月/日 时:分:秒”
)
--filename:指定日志输出路径(设置了这个参数,日志会写入文件中)
--filemode:指定日志文件的打开方式(设置了filename后才有效)
--stream:指定日志的输出流(数据传输的通道如果同时指定了 stream 和 filename 参数,stream 会被忽略 —— 因为 filename 本质是指定了一个 “文件流”,日志系统会优先使用文件流作为输出通道)
综合使用:
这里给出一个综合使用的模板,相较于basicConfig(适用于简单的日志输出),综合使用用到了4大组件更适合日常项目中的使用
import logging
# 1. 创建自定义Logger(指定名称,避免与其他模块冲突)
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG) # 日志器的级别(低于此级别的日志会被过滤)
# 2. 创建Handler(输出目标)
# 2.1 输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台只输出INFO及以上
# 2.2 输出到文件
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.DEBUG) # 文件输出DEBUG及以上
# 3. 创建Formatter(日志格式)
# 控制台格式:简洁
console_formatter = logging.Formatter("%(levelname)s: %(message)s")
# 文件格式:详细(包含时间、模块名、行号)
file_formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s"
)
# 4. 给Handler绑定Formatter
console_handler.setFormatter(console_formatter)
file_handler.setFormatter(file_formatter)
# 5. 给Logger添加Handler(可以添加多个,实现多目标输出)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 测试:使用自定义Logger输出日志
logger.debug("调试:进入login函数") # 只输出到文件(控制台级别为INFO)
logger.info("用户admin登录成功") # 同时输出到控制台和文件
logger.error("登录失败:密码错误") # 同时输出到控制台和文件
逐行解释:
1.
logger = logging.getLogger("my_app")
创建了一个自定义的logger,并且将这个记录日志器的命名为‘myapp’
logging.getLogger()是创建获取日志记录器的方法
Logger(日志记录器)负责产生日志
2.
logger.setLevel(logging.DEBUG)
设置日志记录器的最低日志级别,这里是DEBUG
3.
console_handler = logging.StreamHandler()
创建控制台处理器代码,将日志信息输出到控制台
Handler(处理器—)负责将日志发送到指定的地方
4.
console_handler.setLevel(logging.INFO)
控制台只输出INFO及以上的日志
5.
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.DEBUG)
这里是输出到文件,文件名是app.log
志记录DEBUG及以上的内容
6.
console_formatter = logging.Formatter("%(levelname)s: %(message)s")
创建控制台日志格式
7.
file_formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s"
)
创建文件格式
8.
console_handler.setFormatter(console_formatter)
将之前输出控制台的Handler绑定格式Formatter
9.
file_handler.setFormatter(file_formatter)
将之前输出文件的Handler绑定格式Formatter
10.
logger.addHandler(console_handler)
logger.addHandler(file_handler)
为logger(日志记录器)添加Handler(处理器)
作用:
让同一个日志记录器产生的日志,能够同时输出到多个目的地(如控制台和文件),实现日志的 “多渠道分发”。
如果出现文件log出现乱码的情况,可以在5,也就是创建log文件这里加上encoding = ‘utf-8’
file_handler = logging.FileHandler("app.log",encoding = 'UTF-8')
file_handler.setLevel(logging.DEBUG)
711

被折叠的 条评论
为什么被折叠?



