[编程基础] Python日志记录库logging总结
off999 2025-09-12 01:25 28 浏览 0 评论
Python日志记录教程展示了如何使用日志记录模块在Python中进行日志记录。
文章目录
- 1 介绍
- 1.1 背景
- 1.2 Python日志记录模块
- 1.3 根记录器
- 2 Python logging模块使用教程
- 2.1 Python logging模块简单使用
- 2.2 Python有效日志记录级别
- 2.3 Python有效日志记录级别
- 2.4 Python记录处理程序
- 2.5 Python记录格式化程序
- 2.6 Python日志基本配置
- 2.7 Python日志记录文件配置
- 2.8 Python日志记录变量
- 2.9 Python日志记录格式日期时间
- 2.10 Python日志记录堆栈跟踪
- 2.11 Python记录getLogger
- 3 参考
1 介绍
1.1 背景
日志记录是将信息写入日志文件的过程。日志文件包含有关在操作系统,软件或通信中发生的各种事件的信息。完成记录是出于以下目的:
- 信息收集
- 故障排除
- 产生统计资料
- 审计
- 剖析
记录不仅限于识别软件开发中的错误。它还可用于检测安全事件,监视策略违规,在出现问题时提供信息,查找应用程序瓶颈或生成使用情况数据。应记录的事件包括输入验证失败,身份验证和授权失败,应用程序错误,配置更改以及应用程序启动和关闭。
但是不应记录的事件包括应用程序源代码,会话标识值,访问令牌,敏感的个人数据,密码,数据库连接字符串,加密密钥,银行帐户和持卡人数据。
综上所述,进行日志记录的一些最佳做法:
- 日志记录应该有意义。
- 日志应包含上下文。
- 日志记录应在不同级别进行结构化和完成。
- 日志记录应该是平衡的;它不应该包含太少或太多的信息。
- 记录消息应该是人类可以理解的,并且可以被机器解析。
- 登录更复杂的应用程序应完成几个日志文件。
- 日志应适应开发和生产。
1.2 Python日志记录模块
Python日志模块定义了一些函数和类,这些函数和类为应用程序和库实现了一个灵活的事件日志系统。
日志记录模块具有四个主要组件:记录器(loggers),处理程序(handlers),过滤器(filters)和格式化程序(formatters)。记录器公开了应用程序代码直接使用的接口。处理程序将日志记录(由记录器创建)发送到适当的目的地。筛选器提供了更细粒度的功能,用于确定要输出的日志记录。格式化程序在最终输出中指定日志记录的布局。
Python日志记录级别主要有以下六个:
- CRITICAL 危急
- ERROR 错误
- WARNING 警告
- INFO 信息
- DEBUG 调试
- NOTSET 无设置
要注意日志等级是从上到下依次降低的,即:NOTEST< DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
如果日志记录级别设置为WARNING,所有的WARNING, ERROR以及CRITICAL消息被写入日志文件或控制台。如果它被设置为ERROR,只有ERROR和 CRITICAL消息被记录。
日志记录器具有有效等级的概念。如果未在记录器上显式设置级别,则将其父级别用作其有效级别。如果父级没有显式设置的级别,则检查其父级,依此类推-搜索所有祖先,直到找到显式设置的级别。使用getLogger()创建记录器时,级别设置为NOTSET。如果未使用set level()显式设置日志记录级别,则消息将传播到日志记录父级。在找到级别不是NOTSET的祖先或到达根记录器之前,将遍历日志记录器的祖先链。根记录器设置了默认警告级别。
1.3 根记录器
所有记录器都是根记录器的后代。每个记录器将日志消息传递到其父级。使用该getLogger(name) 方法创建新的记录器。调用不带名称的函数(getLogger())将返回root记录器。根记录器始终具有显式级别集,WARNING 默认情况下为该级别。
根记录器位于层次结构的顶部,并且始终存在,即使未配置。通常,程序或库不应直接针对根日志记录器进行日志记录。相反,应该为程序配置一个特定的记录器。根日志可以用来轻松地打开和关闭所有库中的所有日志。
2 Python logging模块使用教程
python logging模块通常可以直接调用,无需安装
2.1 Python logging模块简单使用
该logging模块具有简单的方法,无需任何配置即可立即使用。这可以用于简单的日志记录。以下示例调用该logging模块的五个方法。消息将写入控制台。请注意,使用了根记录器,并且只写入了三则消息。这是因为默认情况下,仅写入具有级别警告和更高级别的消息。
import logging
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message2.2 Python有效日志记录级别
日志记录级别是用set level()设置的。它将此记录器的阈值设置为lvl。将忽略严重程度低于lvl的日志消息。在下面示例中,我们将日志记录级别更改为DEBUG。
getLogger()返回具有指定名称的记录器。如果name为None,则返回根记录器。名称可以是定义日志层次结构的点分隔字符串;例如“a”、“a.b”或“a.b.c”。
import logging
# getLogger()返回具有指定名称的记录器。如果name为None,则返回根记录器。
logger = logging.getLogger('dev')
# 设置debug级别
logger.setLevel(logging.DEBUG)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')DEBUG:dev:This is a debug message
INFO:dev:This is an info message
WARNING:dev:This is a warning message
ERROR:dev:This is an error message
CRITICAL:dev:This is a critical message2.3 Python有效日志记录级别
有效日志记录级别是显式设置的级别或由日志记录父级确定的级别。每一个日志级别都有与之对应的一个阈值,如果日志级别对应的阈值小于设定值,就不会显示出来。各级别阈值为:
- CRITICAL = 50
- ERROR = 40
- WARNING = 30
- INFO = 20
- DEBUG = 10
- NOTSET = 0
以下示例中,我们检查了两个记录器的有效记录级别。
import logging
main_logger = logging.getLogger('main')
# 设定级别
main_logger.setLevel(logging.ERROR)
# 未设置dev_logger的级别;然后使用其父级的级别。
dev_logger = logging.getLogger()
print(main_logger.getEffectiveLevel())
print(dev_logger.getEffectiveLevel())40
302.4 Python记录处理程序
处理程序是一个对象,负责将适当的日志消息(基于日志消息的严重性)分派到处理程序的指定目标。处理程序像级别一样设定。如果记录器没有处理程序集,则其父记录器将搜索处理程序。
以下示例为记录器创建了两个处理程序:文件处理程序和控制台处理程序。
import logging
logger = logging.getLogger('dev')
logger.setLevel(logging.INFO)
# 文件处理
# FileHandler将日志记录发送到test.log 文件。
fileHandler = logging.FileHandler('test.log')
fileHandler.setLevel(logging.INFO)
# 控制台处理
# StreamHandler将日志记录发送到流。如果未指定控制流,r则使用sys.stder。
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# 将处理程序添加到记录器addHandler()。
logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)
# 打印数据,并且保存数据
logger.info('information message')information message
INFO:dev:information message注意上面的程序在添加到记录器必须移除处理程序(这是这个大坑),不然会重复输出,因为会把当前logger和其父节点所有数据输出,如下所示:
import logging
logger = logging.getLogger('dev')
logger.setLevel(logging.INFO)
# 文件处理
# FileHandler将日志记录发送到test.log 文件。
fileHandler = logging.FileHandler('test.log')
fileHandler.setLevel(logging.INFO)
# 控制台处理
# StreamHandler将日志记录发送到流。如果未指定控制流,r则使用sys.stder。
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# 将处理程序添加到记录器addHandler()。
logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)
# 打印数据,并且保存数据
logger.info('information message')information message
information message
INFO:dev:information message解决办法在记录日志之后通过removeHandler移除处理函数
import logging
logger = logging.getLogger('dev')
logger.setLevel(logging.INFO)
# 文件处理
# FileHandler将日志记录发送到test.log 文件。
fileHandler = logging.FileHandler('test.log')
fileHandler.setLevel(logging.INFO)
# 控制台处理
# StreamHandler将日志记录发送到流。如果未指定控制流,r则使用sys.stder。
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# 将处理程序添加到记录器addHandler()。
logger.addHandler(fileHandler)
logger.addHandler(consoleHandler)
# 打印数据,并且保存数据
logger.info('information message')
# 移除处理函数
logger.removeHandler(fileHandler)
logger.removeHandler(consoleHandler)
# 关闭处理函数
# 不然文件无法删除
# 返回输出只有三个information message输出
fileHandler.close();
consoleHandler.close();information message
information message
information message
INFO:dev:information message2.5 Python记录格式化程序
格式化程序是配置日志记录的最终顺序、结构和内容的对象。除了消息字符串之外,日志记录还包括日期和时间、日志名称和日志级别的严重性。下面示例创建一个控制台记录器,并向其处理程序添加格式化程序。
import logging
logger = logging.getLogger('devs')
logger.setLevel(logging.INFO)
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
logger.addHandler(consoleHandler)
# 创建格式化程序。它包括日期时间,记录器名称,记录级别名称和记录消息。
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s: %(message)s')
consoleHandler.setFormatter(formatter)
logger.info('information message')
logger.removeHandler(consoleHandler)
consoleHandler.close;2020-06-23 22:57:06,591 devs INFO: information message
INFO:devs:information message2.6 Python日志基本配置
basicConfig()配置根记录器。它通过使用默认格式化程序创建流处理程序来完成日志系统的基本配置。如果没有为根记录器定义处理程序,则debug()、info()、warning()、error()和critical()将自动调用basicConfig()。
以下示例使用basicConfig来配置根记录器。
import logging
# filename保存日志,format格式化输出,level设定消息等级
# 运行该程序后,我们在test.log文件中写入了五条消息 。
logging.basicConfig(filename='test.log', format='%(filename)s: %(message)s',
level=logging.DEBUG)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message2.7 Python日志记录文件配置
fileConfig()从configparser格式文件读取日志配置。本文在log.conf定义了一个记录器,处理程序和格式化。
log.conf文件内容如下:
[loggers]
keys=root,dev
[handlers]
keys=consoleHandler
[formatters]
keys=extend,simple
[logger_root]
level=INFO
handlers=consoleHandler
[logger_dev]
level=INFO
handlers=consoleHandler
qualname=dev
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=extend
args=(sys.stdout,)
[formatter_extend]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
[formatter_simple]
format=%(asctime)s - %(message)s以下示例从log.conf中读取日志记录配置文件。
import logging
import logging.config
logging.config.fileConfig(fname='log.conf')
logger = logging.getLogger('dev')
logger.info('This is an information message')2020-06-23 22:57:06,617 - dev - INFO - This is an information message2.8 Python日志记录变量
通过使用字符串格式记录动态数据。以下示例将自定义数据写入日志消息。
import logging
root = logging.getLogger()
root.setLevel(logging.INFO)
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="test.log", format=log_format)
# incident happens
# 将自定义数据写入日志消息。
error_message = 'authentication failed'
root.error(f'error: {error_message}')2020-06-23 22:57:06,624 - root - ERROR - error: authentication failed2.9 Python日志记录格式日期时间
日期时间包含在带有asctime日志记录的日志消息中。使用datefmt配置选项,我们可以格式化datetime字符串。以下示格式化日志消息的日期时间。
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="test.log", format=log_format,
datefmt='%Y-%m-%d %H:%M:%S')
logger.info("information message")2020-06-23 22:57:06,631 - root - INFO - information message2.10 Python日志记录堆栈跟踪
堆栈跟踪是调用函数的堆栈,这些函数一直运行到引发异常时为止。堆栈跟踪包含在exc_info选项中。
以下示例中,我们记录了尝试访问不存在的列表索引时引发的异常。
import logging
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(filename="test.log", format=log_format)
vals = [1, 2]
try:
print(vals[4])
except Exception as e:
# 通过将exc_info设置为True,堆栈跟踪将包含在日志中。
logging.error("exception occurred", exc_info=True)2020-06-23 22:57:06,638 - root - ERROR - exception occurred
Traceback (most recent call last):
File "<ipython-input-12-ef7fe4bd5d82>", line 9, in <module>
print(vals[4])
IndexError: list index out of range2.11 Python记录getLogger
在getLogger()返回具有指定名称的记录器。如果未指定名称,则返回根记录器。通常的做法是将模块名称放在其中。
使用给定名称对此函数的所有调用都返回相同的记录器实例。这意味着记录器实例不需要在应用程序的不同部分之间传递(这一点很坑)。
以下示例使用getLogger()创建一个新的记录器。它有一个文件处理程序和一个格式化程序
import logging
import sys
main = logging.getLogger('main')
main.setLevel(logging.DEBUG)
# 消息将被写入 my.log文件
handler = logging.FileHandler('my.log')
format = logging.Formatter('%(asctime)s %(name)s %(levelname)s: %(message)s')
handler.setFormatter(format)
main.addHandler(handler)
main.info('info message')
main.critical('critical message')
main.debug('debug message')
main.warning('warning message')
main.error('error message')
# 清除数据
main.removeHandler(handler)
handler.close();my.log中内容如下:
2020-06-23 22:54:41,265 main INFO: info message
2020-06-23 22:54:41,265 main CRITICAL: critical message
2020-06-23 22:54:41,265 main DEBUG: debug message
2020-06-23 22:54:41,265 main WARNING: warning message
2020-06-23 22:54:41,265 main ERROR: error message3 参考
http://zetcode.com/python/logging/
相关推荐
- windowsxp下载网站(windows xp download)
-
目前无法下载因为红色警戒XP电脑版是一款已经停止开发的游戏,官方已经停止了对其的支持和更新。虽然网上有一些模拟器可以运行该游戏,但是安装和使用相对困难,而且可能存在版权问题。建议玩家选择其他同类型的游...
- 没人用过的激活码没过期(没人用过的激活码没过期可以用吗)
-
迷你世界并不存在什么激活码的。《迷你世界》是一款高度自由的休闲类3D沙盒游戏,有着非常方便快捷的多人联机模式,只要有网络就能和各个地方的小伙伴们一起玩。这里没有等级和规则限制,没有规定的玩法,只有随心...
- 2017年联想笔记本电脑有几款
-
17年的笔记本电脑可以勉强安装一下win10系统试试。关键看你的内存有多少,内存大于4个G的话可以安装win10速度不会太慢。最好是安装win7系统,这样能发挥你这台电脑的所有的性能,你用起来也会感觉...
- 当前显卡排名(当下显卡排行)
-
101、Irispro5802、Iris62002、Iris52004、UHD630/6205、HD6306、HD5307、HD46008、HD44009、HD420010、HD40...
- win10专业版激活变成企业版(win10专业版激活变成企业版怎么办)
-
win10永久激活密钥很少,一旦网上有分享,等你拿到时就超过期限了,一般是要购买。激活win10系统可以使用激活工具:win10激活工具下载一、win10专业版产品密钥NXRQM-CXV6P-PBGV...
- ghostwinxp下载纯净版(ghost win7纯净版下载)
-
可以下载的,现在官网和其他网站上都可以下载xp原版的。可以通过以下步骤下载我的世界游戏到xp系统中:1.首先打开你的浏览器软件,搜索关键字“我的世界xp版下载”,找到可靠下载地址;2.从下载页面下...
- 惠普完整版驱动(惠普最新驱动)
-
惠普官方的标准操作:HP1050安装驱动步骤:一:准备:拿出驱动光盘放入光驱或到HP官网下载完整版驱动。二:不要插USB数据线或插上线打印机电源不要开,安装完整版驱动,当程序提示插入USB数据线时,插...
- 浏览器最好用的(浏览器最好用的插件)
-
一、谷歌浏览器谷歌浏览器是公认最好用的,这个可以从市场占有率看出端倪,超过三分之二的用户使用谷歌浏览器。Chrome浏览器以简洁快速著称,不管是普通用户还是开发人员,chrome浏览器都是首选。Chr...
- fast路由器6位初始密码(fast路由器的密码)
-
答:fast路由器初始密码是admin;新款的迅捷无线路由器,管理界面没有初始密码。查看迅捷无线路由器底部标签,标签上标注了admin,说明初始密码就是admin;如果没有,说明该路由器没有初始密码。...
- 硬盘恢复软件哪个好(硬盘 恢复软件)
-
迷你兔数据恢复工具:支持恢复硬盘丢失的数据Pc3000数据恢复软件是一款非常专业的硬盘修复工具,能够对电脑硬盘资料数据进行修复,通过使用这个软件可以解决硬盘数据丢失故障,是一个用户进行硬盘资料修复好帮...
- 十大品牌监控摄像头排名(十大品牌监控摄像头排名第一)
-
答:1、华为/HUAWEI9.92、小米/MI9.63、罗技/Logitech9.64、海康威视/HIKVISION9.25、乔安/Jooan9.26、普联/TP-LINK9.27、乐橙8.98、萤石...
- 360手机助手老旧版本大全(360手机助手 老版本)
-
在设置里面找到历史记录就可能查看360手机助手·换机神器是安卓系统的换机软件,因为苹果的换机软件是爱思。1、打开360手机卫士,登陆账号,点击账号。2、进入个人中心,点击账户安全,在密保工具中,点击解...
- 系统应用工程师(系统工程的应用)
-
信息软件系统工程师有前途,毕业以后可以从事软件开发,软件系统的维护,运营等等,和计算机有关的工作内容,因为计算机专业可以说是一个非常热门的专业,很多的大型企业公司基本上都是以计算机研发为主的,薪资福利...
- qq恢复系统常见问题(qq恢复系统常见问题及答案)
-
QQ好友恢复系统一直显示服务器频繁有可能是系统的问题,你的qq重新更新一下,或者你卸载了重新下载一下就有可能好了。您好,很高兴为您解答:您可以试试清空下IE内存,然后关掉不必要的程序,尽量在电脑运...
- win10自带的office不见了(win10自带的office在哪个文件夹)
-
win10系统的office在电脑硬盘office的安装目录里,具体打开安装目录的操作如下:1、首先我们右键点击word,打开方式,选择默认程序打开。2、在默认框打钩,点击【浏览】。3、打开你安装of...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
