Python日志库logging

日志级别

级别对应的数值:
NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)
INFO、WARNING、ERROR、CRITICAL 级别的日志都会输出

logging 流程

Logger:日志,暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效。

LogRecord :日志记录器,将日志传到相应的处理器处理。

Handler :处理器, 将(日志记录器产生的)日志记录发送至合适的目的地。

Filter :过滤器, 提供了更好的粒度控制,它可以决定输出哪些日志记录。

Formatter:格式化器, 指明了最终输出中日志记录的布局

基本使用

参数名称参数描述
filename日志输出到文件的文件名
filemode文件模式,r[+]、w[+]、a[+]
format日志输出的格式
datefat日志附带日期时间的格式
style格式占位符,默认为 “%” 和 “{}”
level设置日志输出级别
stream定义输出流,用来初始化 StreamHandler 对象,不能 filename 参数一起使用,否则会ValueError 异常
handles定义处理器,用来创建 Handler 对象,不能和 filename 、stream 参数一起使用,否则也会抛出 ValueError 异常

常用变量格式如下

变量格式变量描述
asctime%(asctime)s将日志的时间构造成可读的形式,默认情况下是精确到毫秒,如 2018-10-13 23:24:57,832,可以额外指定 datefmt 参数来指定该变量的格式
name%(name)日志对象的名称
filename%(filename)s不包含路径的文件名
pathname%(pathname)s包含路径的文件名
funcName%(funcName)s日志记录所在的函数名
levelname%(levelname)s日志的级别名称
message%(message)s具体的日志信息
lineno%(lineno)d日志记录所在的行号
pathname%(pathname)s完整路径
process%(process)d当前进程ID
processName%(processName)s当前进程名称
thread%(thread)d当前线程ID
threadName%threadName)s当前线程名称

输出INFO

import logging
logging.basicConfig(format=‘%(asctime)s - %(pathname)s[line:%(lineno)d]- %(levelname)s:
%(message)s’, level=logging.INFO)
logging.debug(‘This is a debug message’)
logging.info(“距离是:{},{}”.format(self.des,self._pos))
关掉logging.info,把logging.basicConfig注释掉就可以了

自定义 Logger

上面的基本使用可以让我们快速上手 logging 模块,但一般并不能满足实际使用,我们还需要自定义 Logger。

一个系统只有一个 Logger 对象,并且该对象不能被直接实例化,没错,这里用到了单例模式,获取 Logger 对象的方法为 getLogger。

注意:这里的单例模式并不是说只有一个 Logger 对象,而是指整个系统只有一个根 Logger 对象,Logger 对象在执行 info()、error() 等方法时实际上调用都是根 Logger 对象对应的 info()、error() 等方法。

我们可以创造多个 Logger 对象,但是真正输出日志的是根 Logger 对象。每个 Logger 对象都可以设置一个名字,如果设置logger = logging.getLogger(name),name 是 Python 中的一个特殊内置变量,他代表当前模块的名称(默认为 main)。则 Logger 对象的 name 为建议使用使用以点号作为分隔符的命名空间等级制度。

Logger 对象可以设置多个 Handler 对象和 Filter 对象,Handler 对象又可以设置 Formatter 对象。Formatter 对象用来设置具体的输出格式,

Logger 对象和 Handler 对象都可以设置级别,而默认 Logger 对象级别为 30 ,也即 WARNING,默认 Handler 对象级别为 0,也即 NOTSET。logging 模块这样设计是为了更好的灵活性,比如有时候我们既想在控制台中输出DEBUG 级别的日志,又想在文件中输出WARNING级别的日志。可以只设置一个最低级别的 Logger 对象,两个不同级别的 Handler 对象,示例代码如下:

import logging
import logging.handlerslogger = logging.getLogger("logger")handler1 = logging.StreamHandler()
handler2 = logging.FileHandler(filename="test.log")logger.setLevel(logging.DEBUG)
handler1.setLevel(logging.WARNING)
handler2.setLevel(logging.DEBUG)formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")
handler1.setFormatter(formatter)
handler2.setFormatter(formatter)logger.addHandler(handler1)
logger.addHandler(handler2)# 分别为 103030
# print(handler1.level)
# print(handler2.level)
# print(logger.level)logger.debug('This is a customer debug message')
logger.info('This is an customer info message')
logger.warning('This is a customer warning message')
logger.error('This is an customer error message')
logger.critical('This is a customer critical message')

控制台输出结果为:

2018-10-13 23:24:57,832 logger WARNING This is a customer warning message
2018-10-13 23:24:57,832 logger ERROR This is an customer error message
2018-10-13 23:24:57,832 logger CRITICAL This is a customer critical message

文件中输出内容为:

2018-10-13 23:44:59,817 logger DEBUG This is a customer debug message
2018-10-13 23:44:59,817 logger INFO This is an customer info message
2018-10-13 23:44:59,817 logger WARNING This is a customer warning message
2018-10-13 23:44:59,817 logger ERROR This is an customer error message
2018-10-13 23:44:59,817 logger CRITICAL This is a customer critical message

创建了自定义的 Logger 对象,就不要在用 logging 中的日志输出方法了,这些方法使用的是默认配置的 Logger 对象,否则会输出的日志信息会重复
从字典中获取配置信息:

import logging.configconfig = {'version': 1,'formatters': {'simple': {'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',},# 其他的 formatter},'handlers': { #定义处理器,用来创建 Handler 对象,不能和 filename 、stream 参数一起使用,否则也会抛出 ValueError 异常'console': { 'class': 'logging.StreamHandler','level': 'DEBUG','formatter': 'simple'},'file': {'class': 'logging.FileHandler','filename': 'logging.log','level': 'DEBUG','formatter': 'simple'},# 其他的 handler},'loggers':{'StreamLogger': {'handlers': ['console'],'level': 'DEBUG',},'FileLogger': {# 既有 console Handler,还有 file Handler'handlers': ['console', 'file'],'level': 'DEBUG',},# 其他的 Logger}
}logging.config.dictConfig(config)
StreamLogger = logging.getLogger("StreamLogger")
FileLogger = logging.getLogger("FileLogger")
# 省略日志输出

从配置文件中获取配置信息:

init格式:
[对象]
键=值1,值2

[loggers]
keys=root,sampleLogger[handlers]
keys=consoleHandler[formatters]
keys=sampleFormatter[logger_root]
level=DEBUG
handlers=consoleHandler[logger_sampleLogger]
level=DEBUG
handlers=consoleHandler
qualname=sampleLogger
propagate=0[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=sampleFormatter
args=(sys.stdout,)[formatter_sampleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

testinit.py 文件

import logging.configlogging.config.fileConfig(fname='test.ini', disable_existing_loggers=False)
logger = logging.getLogger("sampleLogger")
# 省略日志输出

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

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

相关文章

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中,如果网络中有n台路由器,若任意两台路由器之间都要建立邻接关系,则需要建立n(n-1)/2个邻接关系,即当路由器很多时,则需要建立和维护的邻接关…

6.优化算法之模拟

1.替换所有的问号 . - 力扣&#xff08;LeetCode&#xff09; class Solution {public String modifyString(String s) {char[] sss.toCharArray();int nss.length;for(int i0;i<n;i){if(ss[i]?){for(char cha;ch<z;ch){if((i0||ss[i-1]!ch)&&(in-1||ss[i1]!c…

Processing入门教程

目录&#xff1a; 课程前言认识PROCESSING 关于像素图形代码色彩与填充练习交互关于setup()和draw()第一次进行移动进一步复杂的交互操作代码实现如下&#xff1a;进一步了解PROCESSING 变量使用变量系统内置变量条件语句逻辑运算符循环语句while循环for循环结构化 函数实参对…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

驱动保险业高质量发展 金融壹账通“保险+科技”输出“数字化红利

近日&#xff0c;金融监管总局局长李云泽在陆家嘴论坛指出&#xff0c;将推动保险业坚持内涵式发展、特色化经营和精细化管理&#xff0c;加快由追求速度和规模&#xff0c;向以价值和效益为中心转变&#xff1b;引导保险机构树立正确的经营观、业绩观、风险观&#xff0c;完善…

出现 ORA-00923: FROM keyword not found where expected 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 服务驱动的时候,一开始弹出这个Bug,找了很久才找到问题所在 2024-06-25 18:39:13.809 | ERROR 1926765 | Druid-ConnectionPool-Create-1203111075

pbootcms提交留言成功后跳转到指定的网址

pbootcms在线留言表单提交成功后&#xff0c;如何跳转到指定的网址&#xff0c;默认提交留言后留在原来的页面&#xff0c;如果提交后需要跳转到指定网址&#xff0c;我们需要对文件进行修改。首先我们打开/core-/function/helper.php文件找到第162行左右代码&#xff1a; ech…

基于STM32的简易智能家居设计

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…

JavaScript小记_如何获取对象的属性?

1. 什么是对象? 多个数据的封装体用来保存多个数据的容器一个对象代表现实中的一个事物 2. 对象的组成 属性: 属性名(字符串)和属性值(任意)组成方法: 一种特别的属性(属性值是函数) 3. 如何访问对象内部数据? .属性名: 编码简单, 属性名由特殊符号组成时不能用[属性名]…

ASUS/华硕幻14 2023 GA402X系列 原厂Windows11-22H2系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

Camera Raw:编辑 - 曲线

Camera Raw “编辑”模块中的曲线 Curve面板提供了曲线这一强大的工具&#xff0c;通过精确控制亮度和对比度&#xff0c;以及调整红、绿、蓝通道的曲线&#xff0c;可以显著提升图像的视觉效果和色彩表现。这些调整工具为摄影师和图像编辑者提供了丰富的创意可能性&#xff0c…

【JS】AI总结:JavaScript中常用的判空方法

在JavaScript中&#xff0c;判空是一个常见的操作&#xff0c;因为变量可能未定义、未初始化或包含特定的空值。以下是JavaScript中常用的判空方法&#xff1a; 使用if语句直接判断&#xff1a; 如果变量是null、undefined、0、NaN、空字符串&#xff08;""&#xff…

在Ubuntu 14.04上安装和配置Elasticsearch的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Elasticsearch 是一个用于实时分布式搜索和数据分析的平台。它因易用性、强大功能和可扩展性而备受欢迎。 Elasticsearch 支持 R…

热管的制作工艺流程

1、什么是热管&#xff0c;热管的起源和发展 热管技术早在1942年前就已出现&#xff0c;当时Perkins发明并改进了热虹吸管&#xff08;一种简单的重力热管&#xff09;。1942年后&#xff0c;Gaugler提出了现代热管的原理&#xff0c;但未实际应用。直到1963年在位于美国的Los…

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

vue开发过程中&#xff0c;父组件通过props传值给子组件&#xff0c;子组件在页面展示父组件的值&#xff0c;在操作子组件值以后&#xff0c;即使不点击确定按钮&#xff0c;父组件中的值也发生了变化&#xff0c;但是需求是操作子组件数据以后&#xff0c;必须点击"确定…

C# 中 MessageBox 定时关闭

C# 中 MessageBox 定时关闭 WPF中 System.Windows.Forms 的 MessageBox 并未提供定时关闭的功能&#xff0c;所以要实现此目标&#xff0c;需添加一些其他代码&#xff0c;如定时监控等。 需求说明&#xff1a; 弹出提示框后若一定时间内未点击此提示框&#xff0c;则其自动…

【信息系统项目管理师知识点速记】项目管理实践模型

20.5 项目管理实践模型 随着项目管理理论和实践在全球范围内的不断发展和积累,多个组织开发并发布了项目管理的最佳实践集合,其中得到广泛使用的是CMMI模型和PRINCE2模型,用于指导各个领域组织的项目管理活动。利用CMMI模型和PRINCE2模型的最佳实践,能够迅速将项目管理者的…

【AI提升】AI利器Tool Call/Function Call(一):langchain+ollama+llama3/qwen2

1、使用AI的一个常用场景就是&#xff0c;接收人类的语言&#xff0c;识别人类的意图&#xff0c;最终进行相关的业务处理&#xff0c;这就是设计Tool Call / Function Call的初衷。 2、现在一般都说Tool Call&#xff0c;以前常叫Function Call&#xff0c;不要纠结。 一、安…

探索 .NET 基准测试库(BenchmarkDotNet)

基准测试是软件开发中的一项重要实践&#xff0c;它允许开发人员测量和比较不同代码段的性能。在 .NET 中&#xff0c;最流行的基准测试库之一是 BenchmarkDotNet。这里将介绍 BenchmarkDotNet&#xff0c;解释它为何必不可少&#xff0c;并提供分步示例来帮助您入门。 什么是…

程序猿大战Python——实现简单的图书馆系统操作

步骤1&#xff1a;安装和导入库 首先&#xff0c;确保已经安装了 pymysql 库。如果没有安装&#xff0c;请执行以下命令&#xff1a; pip install pymysql 然后&#xff0c;导入必要的库&#xff1a; import pymysql 步骤2&#xff1a;创建数据库和表的函数 编写一个函数来…