Python 日志教程展示了如何使用日志模块在 Python 中进行日志。
日志
日志是将信息写入日志文件的过程,日志文件包含有关在操作系统,软件或通信中发生的各种事件的信息。
记录目的
完成记录是出于以下目的:
- 信息收集
- 故障排除
- 产生统计数据
- 稽核
- 剖析
记录不仅限于识别软件开发中的错误。 它还可用于检测安全事件,监视策略违规,在出现问题时提供信息,查找应用瓶颈或生成使用情况数据。
要记录哪些事件
应记录的事件包括输入验证失败,身份验证和授权失败,应用错误,配置更改以及应用启动和关闭。
哪些事件不记录
不应记录的事件包括应用源代码,会话标识值,访问令牌,敏感的个人数据,密码,数据库连接字符串,加密键,银行帐户和持卡人数据。
记录最佳做法
以下是进行日志的一些最佳做法:
- 日志应该有意义。
- 日志应包含上下文。
- 日志应在不同级别进行结构化和完成。
- 测井应保持平衡; 它不应包含过多或过多的信息。
- 记录消息应该是人类可以理解的,并且可以被机器解析。
- 登录更复杂的应用应完成几个日志文件。
- 测井应适应开发和生产。
日志模块
Python 日志模块定义了实现用于应用和库的灵活事件日志系统的函数和类。
日志模块组件
日志模块具有四个主要组件:记录器,处理程序,过滤器和格式化程序。 记录器公开了应用代码直接使用的接口。 处理程序将日志(由记录器创建)发送到适当的目的地。 筛选器提供了更细粒度的功能,用于确定要输出的日志。 格式化程序在最终输出中指定日志的布局。
Python 日志层次结构
Python 记录器形成一个层次结构。 名为main
的记录器是main.new
的父级。
子记录器将消息传播到与其祖先记录器关联的处理程序。 因此,不必为应用中的所有记录器定义和配置处理程序。 为顶级记录器配置处理程序并根据需要创建子记录器就足够了。
Python 日志级别
级别用于标识事件的严重性。 有六个日志级别:
- 危急
- 错误
- 警告
- 信息
- 调试
- 没有设置
如果日志级别设置为WARNING
,则所有WARNING
,ERROR
和CRITICAL
消息都将写入日志文件或控制台。 如果将其设置为ERROR
,则仅记录ERROR
和CRITICAL
消息。
记录器的概念是有效级别。 如果未在记录器上显式设置级别,则将其父级别用作其有效级别。 如果父级没有显式设置的级别,则检查其父级,依此类推-搜索所有祖先,直到找到显式设置的级别。
使用getLogger()
创建记录器时,级别设置为NOTSET
。 如果未使用setLevel()
显式设置日志级别,则消息将传播到记录器父级。 遍历记录器的祖先记录器链,直到找到具有NOTSET
以外级别的祖先或到达根。 根记录器具有默认的WARNING
级别设置。
根记录器
所有记录器都是根记录器的后代。 每个记录器将日志消息传递到其父级。 使用getLogger(name)
方法创建新的记录器。 调用不带名称的函数(getLogger()
)将返回 root 记录器。
根记录器始终具有显式级别集,默认情况下为WARNING
。
根发信人位于层次结构的顶部,即使未配置,也始终存在。 通常,程序或库不应直接登录到根记录器。 而是应配置该程序的特定记录器。 根记录器可用于轻松打开和关闭所有库中的所有记录器。
Python 日志简单示例
logging
模块具有简单的方法,可以立即使用而无需任何配置。 这可以用于简单的日志。
simple.py
该示例调用logging
模块的五个方法。 消息将写入控制台。
请注意,使用了根记录器,并且只写入了三则消息。 这是因为默认情况下,仅写入具有级别警告和更高级别的消息。
Python 设置日志级别
记录级别由setLevel()
设置。 它将此记录器的阈值设置为lvl
。 严重性不及lvl
的日志消息将被忽略。
set_level.py
在示例中,我们将日志级别更改为DEBUG
。
getLogger()
返回具有指定名称的记录器。 如果名称为None
,则返回根记录器。 名称可以是点分隔的字符串,用于定义日志层次结构。 例如“ a”,“ a.b”或“ a.b.c”。 请注意,有一个隐式根名,未显示。
现在,所有消息均已写入。
Python 有效日志级别
有效日志级别是显式设置的级别或由记录器父级确定的级别。
effective_level.py
在示例中,我们检查了两个记录器的有效记录级别。
未设置dev_logger
的电平; 然后使用其父级。
Python 日志处理程序
处理程序是一个对象,负责将适当的日志消息(基于日志消息的严重性)调度到处理程序的指定目标。
处理程序像级别一样传播。 如果记录器未设置处理程序,则其祖先链将搜索处理程序。
handlers.py
该示例为记录器创建两个处理程序:文件处理程序和控制台处理程序。
FileHandler
将日志发送到test.log
文件。
StreamHandler
将日志发送到流。 如果未指定流,则使用sys.stderr
。
该处理程序将通过addHandler()
添加到记录器。
Python 日志格式化程序
格式化程序是一个对象,用于配置日志的最终顺序,结构和内容。 除消息字符串外,日志还包括日期和时间,日志名称和日志级别严重性。
formatter.py
该示例创建一个控制台记录器,并将格式化程序添加到其处理程序。
格式化程序已创建。 它包括日期时间,记录器名称,记录级别名称和记录消息。
格式化程序通过setFormatter()
设置为处理程序。
具有定义格式的消息显示在控制台中。
Python 日志 basicConfig
basicConfig()
配置根记录器。 它通过使用默认格式化程序创建流处理程序来为日志系统进行基本配置。 如果没有为根记录器定义处理程序,则debug()
,info()
,warning()
,error()
和critical()
自动调用basicConfig()
。
basic_config.py
该示例使用basicConfig
配置根记录器。
使用filename
,我们设置要写入日志消息的文件。 format
确定将什么内容记录到文件中; 我们有文件名和消息。 使用level
,设置记录阈值。
运行该程序后,我们将五条消息写入test.log
文件。
Python 日志文件配置
fileConfig()
从 configparser 格式文件中读取日志配置。
log.conf
log.conf
定义了记录器,处理程序和格式化程序。
file_config.py
该示例从log.conf
读取日志配置文件。
Python 日志变量
通过使用字符串格式记录动态数据。
log_variable.py
该示例将自定义数据写入日志消息。
这是日志消息。
Python 日志格式化日期时间
日期时间包含在asctime
日志的日志消息中。 使用datefmt
配置选项,我们可以格式化日期时间字符串。
date_time.py
该示例格式化日志消息的日期时间。
我们将日期时间字符串包含在asctime
中。
datefmt
选项格式化日期时间字符串。
注意 dattime 字符串格式的不同。
Python 日志堆栈跟踪
堆栈跟踪是调用函数的堆栈,这些函数一直运行到引发异常时为止。 堆栈跟踪包含在exc_info
选项中。
stack_trace.py
在该示例中,我们记录了尝试访问不存在的列表索引时引发的异常。
通过将exc_info
设置为True
,堆栈跟踪将包含在日志中。
堆栈跟踪包含在日志中。
Python 日志getLogger
getLogger()
返回具有指定名称的记录器。 如果未指定名称,则返回根记录器。 在__name__
中放置模块名称是一种常见的做法。
使用给定名称对该函数的所有调用均返回相同的记录器实例。 这意味着记录器实例永远不需要在应用的不同部分之间传递。
get_logger.py
该示例使用getLogger()
创建一个新的记录器。 它有一个文件处理程序和一个格式化程序。
创建了一个名为main
的记录器; 我们将日志级别设置为DEBUG
。
创建一个文件处理程序。 消息将被写入my.log
文件。
格式化程序已创建。 它包括时间,记录器名称,记录级别以及要记录的消息。 格式化程序通过setFormatter()
设置为处理程序。
该处理程序将通过addHandler()
添加到记录器。
这些是书面的日志消息。
Python 日志 YAML 配置
日志详细信息可以在 YAML 配置文件中定义。 YAML 是一种人类可读的数据序列化语言。 它通常用于配置文件。
我们需要安装pyyaml
模块。
config.yaml
在配置文件中,我们定义了各种格式化程序,处理程序和记录器。 propagate
选项可防止将日志消息传播到父级记录器。 就我们而言,是根记录器。 否则,消息将被复制。
log_yaml.py
在示例中,我们读取配置文件并使用dev
记录器。
当我们运行程序时,控制台上有两条消息。 控制台处理程序使用带有较少信息的简单格式化程序。
test.log
文件中有日志消息,它们由扩展的格式化程序提供,具有更多信息。
在本教程中,我们使用了 Python 日志库。 您可能也对相关教程感兴趣: Python Jinja 教程, Bottle 教程, Python 教程。