0基础学习Python路径(31)logging模块

news2025/2/22 12:17:45

Python logging 模块定义了为应用程序和库实现灵活的事件日志记录的函数和类。

程序开发过程中,很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志还可能有错误、警告等信息输出,Python 的 logging 模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志记录提供了一组便利功能,用于简单的日志记录用法。

  • 使用 Python Logging 模块的主要好处是所有 Python 模块都可以参与日志记录
  • Logging 模块提供了大量具有灵活性的功能

日志记录函数以它们用来跟踪的事件的级别或严重性命名。下面描述了标准级别及其适用性(从高到低的顺序):

日志等级(level)描述
DEBUG最详细的日志信息,典型应用场景是 问题诊断
INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

日志级别等级排序:critical > error > warning > info > debug

级别越高打印的日志越少,反之亦然,即

  • debug : 打印全部的日志( notset 等同于 debug )
  • info : 打印 info, warning, error, critical 级别的日志
  • warning : 打印 warning, error, critical 级别的日志
  • error : 打印 error, critical 级别的日志
  • critical : 打印 critical 级别

一、 Logging 模块日志记录方式

Logging 模块提供了两种日志记录方式:

  • 一种方式是使用 Logging 提供的模块级别的函数
  • 另一种方式是使用 Logging 日志系统的四大组件记录

1、Logging 定义的模块级别函数

函数说明
logging.debug(msg, *args, **kwargs)创建一条严重级别为DEBUG的日志记录
logging.info(msg, *args, **kwargs)创建一条严重级别为INFO的日志记录
logging.warning(msg, *args, **kwargs)创建一条严重级别为WARNING的日志记录
logging.error(msg, *args, **kwargs)创建一条严重级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs)创建一条严重级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs)创建一条严重级别为level的日志记录
logging.basicConfig(**kwargs)对root logger进行一次性配置

简单打印日志:

import logging

# 打印日志级别
def test_logging():
    logging.debug('Python debug')
    logging.info('Python info')
    logging.warning('Python warning')
    logging.error('Python Error')
    logging.critical('Python critical')

test_logging()

输出结果:

WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

当指定一个日志级别之后,会记录大于或等于这个日志级别的日志信息,小于的将会被丢弃,
默认情况下日志打印只显示大于等于 WARNING 级别的日志。

1.1 设置日志显示级别

通过 logging.basicConfig() 可以设置 root 的日志级别,和日志输出格式。

logging.basicConfig() 关键字参数

关键字描述
filename创建一个 FileHandler,使用指定的文件名,而不是使用 StreamHandler。
filemode如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为 'a')。
formathandler 使用指明的格式化字符串。
datefmthandler 使用指明的格式化字符串。
level指明根 logger 的级别。
stream使用指明的流来初始化 StreamHandler。该参数与 'filename' 不兼容,如果两个都有,'stream' 被忽略。

format 格式

格式描述
%(levelno)s打印日志级别的数值
%(levelname)s打印日志级别名称
%(pathname)s打印当前执行程序的路径
%(filename)s打印当前执行程序名称
%(funcName)s打印日志的当前函数
%(lineno)d打印日志的当前行号
%(asctime)s打印日志的时间
%(thread)d打印线程 ID
%(threadName)s打印线程名称
%(process)d打印进程 ID
%(message)s打印日志信息

注意:Logging.basicConfig() 需要在开头就设置,在中间设置并无作用

实例

import logging

# 打印日志级别
def test():
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('Python debug')
    logging.info('Python info')
    logging.warning('Python warning')
    logging.error('Python Error')
    logging.critical('Python critical')
    logging.log(2,'test')
test()

输出:

DEBUG:root:Python debug
INFO:root:Python info
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

1.2 将日志信息记录到文件

# 日志信息记录到文件
logging.basicConfig(filename='F:/example.log', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

在相应的路径下会有 example.log 日志文件,内容如下:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

1.3 多个模块记录日志信息

如果程序包含多个模块,则用以下实例来显示日志信息:
实例中有两个模块,一个模块通过导入另一个模块的方式用日志显示另一个模块的信息:

myapp.py 模块

import logging
import mylib
def main():
    logging.basicConfig(filename='myapp.log',level=logging.DEBUG)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

mylib.py 模块

import logging

def do_something():
    logging.info('Doing something')

执行 myapp.py 模块会打印相应日志,在文件 myapp.log 中显示信息如下:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finishe

1.4 显示信息的日期及更改显示消息格式

显示消息日期

import logging
# 显示消息时间
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')

logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

结果:

2019-10-16 18:57:45,988 is when this event was logged.
2019-10-16 18:57:45,988 is when this event was logged.

更改显示消息格式

import logging
# 更改显示消息的格式
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('Python message format Debug')
logging.info('Python message format Info')
logging.warning('Python message format Warning')

结果:

DEBUG:Python message format Debug
INFO:Python message format Info
WARNING:Python message format Warning

注意:显示结果只显示级别和具体信息,之前显示的 “根” 已经消失,重新定义的格式修改了默认输出方式。

2、logging 模块四大组件

组件名称对应类名功能描述
日志器Logger暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效
处理器Handler将 logger 创建的日志记录发送到合适的目的输出
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器Formatter决定日志记录的最终输出格式

2.1 日志器- Logger

Logger 持有日志记录器的方法,日志记录器不直接实例化,而是通过模块级函数 logger.getlogger (name) 来实例化,使用相同的名称多次调用 getLogger() 总是会返回对相同 Logger 对象的引用。

  • 应用程序代码能直接调用日志接口。
  • Logger最常用的操作有两类:配置和发送日志消息。
  • 初始化 logger = logging.getLogger("endlesscode"),获取 logger 对象,getLogger() 方法后面最好加上所要日志记录的模块名字,配置文件和打印日志格式中的 %(name)s 对应的是这里的模块名字,如果不指定name则返回root对象。
  • logger.setLevel(logging.DEBUG),Logging 中有 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
  • 多次使用相同的name调用 getLogger 方法返回同一个 looger 对象;

Logger是一个树形层级结构,在使用接口 debug,info,warn,error,critical 之前必须创建 Logger 实例:

创建方法: logger = logging.getLogger(logger_name)

创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器 Handler:

  • logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
  • logger.addHandler(handler_name) # 为 Logger 实例增加一个处理器
  • logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器

2.2 处理器- Handler

Handler 处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler

StreamHandler

创建方法:sh = logging.StreamHandler(stream=None)

创建 StreamHandler 之后,可以通过使用以下方法设置日志级别,设置格式化器 Formatter,增加或删除过滤器 Filter:

ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略

ch.setFormatter(formatter_name) # 设置一个格式化器formatter

ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个
 
ch.removeFilter(filter_name) # 删除一个过滤器

2.3 过滤器- Filter

Handlers 和 Loggers 可以使用 Filters 来完成比级别更复杂的过滤。
Filter 基类只允许特定 Logger 层次以下的事件。
例如用 ‘A.B’ 初始化的 Filter 允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。

创建方法: filter = logging.Filter(name='')

2.4 格式器- Formatter

使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt 是消息的格式化字符串,datefmt 是日期字符串。如果不指明 fmt,将使用 '%(message)s' 。如果不指明 datefmt,将使用 ISO8601 日期格式。

2.5 组件之间的关联关系

  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,不同的处理器(handler)可以将日志输出到不同的位置;
  • 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

简明了说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

  • Logger 可以包含一个或多个 Handler 和 Filter
  • Logger 与 Handler 或 Fitler 是一对多的关系
  • 一个 Logger 实例可以新增多 个 Handler,一个 Handler 可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

二、Logging 日志工作流程

1、Logging 模块使用过程

1)第一次导入 logging 模块或使用 reload 函数重新导入 logging 模块,logging 模块中的代码将被执行,这个过程中将产生 logging 日志系统的默认配置。

2)自定义配置(可选),logging标准模块支持三种配置方式: dictConfig,fileConfig,listen。其中,dictConfig 是通过一个字典进行配置 Logger,Handler,Filter,Formatter;fileConfig 则是通过一个文件进行配置;而 listen 则监听一个网络端口,通过接收网络数据来进行配置。当然,除了以上集体化配置外,也可以直接调用 Logger,Handler 等对象中的方法在代码中来显式配置。

3)使用 logging 模块的全局作用域中的 getLogger 函数来得到一个 Logger 对象实例(其参数即是一个字符串,表示 Logger 对象实例的名字,即通过该名字来得到相应的 Logger 对象实例)。

4)使用 Logger 对象中的 debug,info,error,warn,critical 等方法记录日志信息。

2、Logging 模块处理流程

logging 处理流程

流程描述:

  1. 判断日志的等级是否大于 Logger 对象的等级,如果大于,则往下执行,否则,流程结束。

  2. 产生日志:第一步,判断是否有异常,如果有,则添加异常信息。
    第二步,处理日志记录方法(如 debug,info 等)中的占位符,即一般的字符串格式化处理。

  3. 使用注册到 Logger 对象中的 Filters 进行过滤。如果有多个过滤器,则依次过滤;只要有一个过滤器返回假,则过滤结束,且该日志信息将丢弃,不再处理,而处理流程也至此结束。否则,处理流程往下执行。

  4. 在当前 Logger 对象中查找 Handlers,如果找不到任何 Handler,则往上到该 Logger 对象的父 Logger 中查找;如果找到一个或多个 Handler,则依次用 Handler 来处理日志信息。但在每个 Handler 处理日志信息过程中,会首先判断日志信息的等级是否大于该 Handler 的等级,如果大于,则往下执行(由 Logger 对象进入 Handler 对象中),否则,处理流程结束。

  5. 执行 Handler 对象中的 filter 方法,该方法会依次执行注册到该 Handler 对象中的 Filter。如果有一个 Filter 判断该日志信息为假,则此后的所有 Filter 都不再执行,而直接将该日志信息丢弃,处理流程结束。

  6. 使用 Formatter 类格式化最终的输出结果。 注:Formatter 同上述第 2 步的字符串格式化不同,它会添加额外的信息,比如日志产生的时间,产生日志的源代码所在的源文件的路径等等。

  7. 真正地输出日志信息(到网络,文件,终端,邮件等)。至于输出到哪个目的地,由 Handler 的种类来决定。

三、配置日志

程序员可以通过三种方式配置日志记录:

1、使用配置方法的 Python 代码显式创建记录器,处理程序和格式化程序。

2、创建日志记录配置文件并使用该 fileConfig() 功能读取它。

3、创建配置信息字典并将其传递给 dictConfig()函数。

下面使用 Python 代码配置一个非常简单的记录器,一个控制台处理程序和一个简单的格式化程序:

logging.conf 配置文件

[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

config_logging.py 配置器

import logging
# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

recorder 记录器

import logging
import logging.config

logging.config.fileConfig('logging.conf')

# create logger
logger = logging.getLogger('simpleExample')

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

运行结果:

2019-10-16 19:45:34,440 - simple_example - DEBUG - debug message
2019-10-16 19:45:34,440 - simple_example - INFO - info message
2019-10-16 19:45:34,440 - simple_example - WARNING - warn message
2019-10-16 19:45:34,440 - simple_example - ERROR - error message
2019-10-16 19:45:34,441 - simple_example - CRITICAL - critical message

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV绘图函数(4)绘制轮廓线的函数drawContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数会在图像中绘制轮廓线&#xff0c;如果 thickness ≥ 0&#xff0c;则绘制轮廓线&#xff1b;如果 thickness < 0&#xff0c;则填充由轮…

【JLINK】RTT Viewer 的使用

​​​​​​ 一、使用说明 1.1 查找 RTT 缓冲区的开始位置 echo off if exist .\Debug\%PRJ_NAME%.map (findstr /C:" _SEGGER_RTT" .\Debug\%PRJ_NAME%.map rem findstr /C:" __StackTop " .\Debug\%PRJ_NAME%.map rem findstr /C:" Reset_Handle…

从欧拉公式的美到旋转位置编码RoPE

也许你在某些场合听说过欧拉公式&#xff0c;也许你干脆对数学不感冒。机缘巧合下&#xff0c;你点开了这篇文章&#xff0c;大致浏览了下然后关闭&#xff0c;继续为自己的工作学习忙碌。这不妨碍你暂停忙碌的脚步&#xff0c;欣赏她的美。 若干年后&#xff0c;你应该不曾记得…

Java基础(2)- Java环境

目录 一、jvm和跨平台 二、JDK 和 JRE 三、JDK的下载和安装 四、配置环境变量 一、jvm和跨平台 1.jvm&#xff08;Java虚拟机&#xff09;类似于翻译官&#xff1a;java运行程序的假想计算机&#xff0c;主要运行java程序。 2.跨平台&#xff1a;指不同操作系统。 3.关系…

网上买大流量卡要问哪些问题?几个常见的问与答!

大家都比较关注的几个常见的流量卡问题&#xff0c;答案来喽&#xff01; 这几个问题特别适合刚刚接触流量卡的朋友&#xff0c;如果你在购买流量卡时不知道该了解什么&#xff0c;该向商家问什么的时候&#xff0c;不妨问问这几个问题吧&#xff0c;接下来&#xff0c;这篇文…

python 实现square root平方根算法

square root平方根算法介绍 计算平方根&#xff08;Square Root&#xff09;的算法有多种&#xff0c;这里介绍几种常见的方法&#xff1a; 牛顿迭代法&#xff08;Newton’s Method&#xff09; 牛顿迭代法是一种在实数域和复数域上近似求解方程的方法。对于平方根问题&…

home kit认证

在当今快节奏的生活中&#xff0c;智能家居技术正不断改变我们的居住体验。home kit 将这一领域提升到了全新的高度。它不仅让智能家居设备的管理变得更为简单直观&#xff0c;还通过高水平的安全性和互操作性&#xff0c;为用户提供了无缝的体验。 一、什么是home kit home k…

CentOS7将yum源更换为国内源保姆级教程

在 CentOS 7 系统中更改 YUM 源到国内源可以显著提高软件包的下载速度&#xff0c;因为国内源服务器通常距离中国大陆用户更近。以下是一个详细的步骤来完成这一操作&#xff1a; 步骤 1: 备份原有配置 首先&#xff0c;备份原系统中的 yum 配置文件以防万一&#xff1a; BA…

红黑树模拟实现STL中的map与set——C++

1.红黑树的迭代器 &#xff08;本篇代码基于我写的红黑树的实现这篇博客&#xff09; 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器&#xff0c;需要考虑以下问题&#xff1a; begin()与end()&#xff1a; STL明确规定&…

无人机侦测:光电识别追踪设备(双光)技术详解

无人机侦测中的光电识别追踪设备&#xff08;双光&#xff09;技术&#xff0c;是一种高效且精准的目标识别与追踪手段&#xff0c;特别适用于无人机平台。以下是对该技术的详细解析&#xff1a; 一、技术概述 光电识别追踪设备&#xff08;双光&#xff09;结合了可见光和红…

企业微信iPad协议:自定义接入需求,为行业提供新助力

在当今数字化时代&#xff0c;企业如何有效连接客户、提升营销效率成为了一个重要议题。iPad协议&#xff0c;或称企业微信协议&#xff0c;作为基于微信iPad协议的智能接口服务&#xff0c;优势及其在企业营销中的应用。 什么是iPad协议&#xff1f; iPad协议是一种智能控制…

<数据集>塑料瓶识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3331张 标注数量(xml文件个数)&#xff1a;3331 标注数量(txt文件个数)&#xff1a;3331 标注类别数&#xff1a;1 标注类别名称&#xff1a;[bottle] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对…

Swift concurrency 2 — async await的理解与使用

async / await 将函数标记为async会告诉Swift编译器该函数是异步执行的&#xff0c;是可以挂起的。await关键字标记了这些挂起点。当一个函数在await调用时被挂起时&#xff0c;它所执行的线程可以用来执行其他工作。当等待的工作完成时&#xff0c;运行时可以恢复函数的执行。…

网络实用工具

ping 测试与目标主机的连通性 显示解释www.a.shifen.com (14.215.177.39)ping目标主机的域名和IP&#xff08;ping会自动将域名转换为IP&#xff09;56(84)不带包头的包大小和带包头的包大小icmp_seq1ping序列,从1开始如果数字不是顺序递增即有丢包ttl54数据包剩余生存时间, 默…

Python | Leetcode Python题解之第378题有序矩阵中第K小的元素

题目&#xff1a; 题解&#xff1a; class Solution:def kthSmallest(self, matrix: List[List[int]], k: int) -> int:n len(matrix)def check(mid):i, j n - 1, 0num 0while i > 0 and j < n:if matrix[i][j] < mid:num i 1j 1else:i - 1return num > …

MS sqlserver备份软件 SQLBackupAndFTP

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

Linux—— 配置ssl安全证书

一、实验设计 二、实验配置过程 [studentbogon ~]$ su - root Password: [rootbogon ~]# dnf -y install nginx [rootbogon ~]# vim /etc/selinux/config [rootbogon ~]# setenforce 0 [rootbogon ~]# systemctl stop firewalld 清空防火墙规则 [rootbogon ~]# iptables -F ^C…

CHARLS数据库挖掘系列教程(1)---数据库下载

CHARLS 是一项具备中国大陆 45 岁及以上人群代表性的追踪调查&#xff0c;旨在建设一个高质量的公共微观数据库&#xff0c;采集的信息涵盖社会经济状况和健康状况等多维度的信息&#xff0c;以满足老龄科学研究的需要。 为利用国际上最佳的数据采集方式&#xff0c;并确保研究…

YOLOv8实例分割推理流程及Python代码

1.YOLOv8_Seg推理流程 2.YOLOv8_Seg推理代码 3.全部代码 """ yolov8:目标检测推理代码 python """ import torch import cv2 import numpy as np import onnxruntime as ort import os import torch.nn.functional as F def xywh2xyxy(x):"…

【K8S 基本概念】Kubernets的架构和核心概念及集群搭建

一、Kubernets 1.作用&#xff1a;用于自动部署扩展以及管理容器化部署的应用程序&#xff0c;半开源&#xff0c;k8s的底层是基于谷歌go语言开发的&#xff0c;负责自动化运维管理多个容器化的应用的集群&#xff0c;容器编排框架的工具。现在使用的版本1.18-1.24&#xff0c…