『无为则无心』Python日志 — 65、日志模块logging的使用
1、logger类用法
logger
类:logger
用于提供日志接口,常用于配置和发送日志消息。
我们一般使用logging.getLogger(name)
方法来获得一个logger
对象。
其中,可选参数name
指定日志器名称,默认为“root”。
常用方法包括:
logger.setLevel()
:设置日志器处理日志信息的最低级别。logger.addHandler()
:为该logger
对象添加一个handler
对象。logger.removeHandler()
:为该logger
对象添加移除一个handler
对象。logger.addFilter()
:为该logger
对象添加一个filter
对象。logger.removeFilter()
:为该logger
对象移除一个filter
对象。- 创建一个对应等级的日志记录:
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
logger.log()
:获取一个日志level
参数,来创建一个日志记录。
示例:
"""
logging模块是Python的内置模块,不需要安装。
"""
# 导入logging模块
import logging
# 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger')
# 输出日志信息
logger.debug('输出debug级别的日志')
logger.info('输出info级别的日志')
logger.warning('输出warning级别的日志')
logger.error('输出error级别的日志')
logger.critical('输出critical级别的日志')
"""
# 右键执行代码
# 结果如下:
输出warning级别的日志
输出error级别的日志
输出critical级别的日志
"""
总结:
默认情况下Python的logging
模块将日志打印到了标准输出中(控制台),且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING。
2、handler类用法
handler
类:handler
对象用于将指定的日志信息发送到指定的位置。
一个logger
对象可以添加多个handler
,每个handler
又可以定义不同日志级别,以实现日志分级过滤显示。
也就是说通过handler
我们可以将日志同时输出到多个位置。
常用的方法包括:
handler.setLevel()
:设置handler
处理的日志信息最低级别。handler.setFormatter()
:为handler
设置一个格式器对象。handler.addFilter()
:为handler
添加一个过滤器对象。handler.removeFilter()
:为handler
删除一个过滤器对象。logging.StreamHandler()
:将日志信息发送到Stream
。logging.FileHandler()
:将日志消息发送到磁盘文件。
示例:把上面的示例,实现DEBUG级别日志的输出。
"""
logging模块是Python的内置模块,不需要安装。
"""
# 导入logging模块
import logging
# 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger')
# 1.设置logger日志级别
logger.setLevel(logging.DEBUG)
# 2.创建一个输出的处理器,让它输入到控制台
sh = logging.StreamHandler()
# 3.把输出处理器添加到日志器中
logger.addHandler(sh)
# 输出日志信息
logger.debug('输出debug级别的日志')
logger.info('输出info级别的日志')
logger.warning('输出warning级别的日志')
logger.error('输出error级别的日志')
logger.critical('输出critical级别的日志')
"""
# 右键执行代码
# 结果如下:
输出debug级别的日志
输出info级别的日志
输出warning级别的日志
输出error级别的日志
输出critical级别的日志
"""
说明:
当我们设置好logger
日志级别后,执行代码,发现还是和上面一样,只输出了warning
级别日志。
这个时候我们是改变了logger
默认设置,就需要创建一个日志处理器Handler
,来处理输出这个自定义logger
对象的日志输出。
3、formatter类用法
formatter
类:formatter
对象用来输出格式化字符串,也叫做格式器。
构造方法如下:
logging.Formatter.__init__(fmt=None, datefmt=None)
其中:
fmt
:指定信息(日志)的格式化字符串,如不设定则使用信息的原始字符串。
datefmt
:指定日期的格式化字符串,如不设定则使用默认格式"%Y-%m-%d %H:%M:%S"
logging
模块中定义好的可以用于format
格式字符串说明:
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime |
%(asctime)s |
将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’ 精确到毫秒。 |
name |
%(name)s |
所使用的日志器名称,默认是root ,因为默认使用的是 rootLogger 。 |
filename |
%(filename)s |
调用日志输出函数的模块的文件名; pathname 的文件名部分,包含文件后缀。 |
funcName |
%(funcName)s |
由哪个function 发出的log , 调用日志输出函数的函数名。 |
levelname |
%(levelname)s |
日志的最终等级(被filter 修改后的)。 |
message |
%(message)s |
日志信息, 日志记录的文本内容。 |
lineno |
%(lineno)d |
当前日志的行号, 调用日志输出函数的语句所在的代码行。 |
levelno |
%(levelno)s |
该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)。 |
pathname |
%(pathname)s |
完整路径 ,调用日志输出函数的模块的完整路径名,可能没有。 |
process |
%(process)s |
当前进程, 进程ID。可能没有。 |
processName |
%(processName)s |
进程名称,Python 3.1新增。 |
thread |
%(thread)s |
当前线程, 线程ID。可能没有。 |
threadName |
%(thread)s |
线程名称。 |
module |
%(module)s |
调用日志输出函数的模块名,filename 的名称部分,不包含后缀即不包含文件后缀的文件名。 |
created |
%(created)f |
当前时间,用UNIX标准的表示时间的浮点数表示; 日志事件发生的时间--时间戳,就是当时调用time.time() 函数返回的值。 |
relativeCreated |
%(relativeCreated)d |
输出日志信息时的,自Logger 创建以 来的毫秒数; 日志事件发生的时间相对于logging 模块加载时间的相对毫秒数。 |
msecs |
%(msecs)d |
日志事件发生事件的毫秒部分。logging.basicConfig() 中用了参数datefmt ,将会去掉asctime 中产生的毫秒部分,可以用这个加上。 |
示例:
"""
logging模块是Python的内置模块,不需要安装。
步骤:
1,定义格式器
2,把格式器输入处理器中
"""
# 导入logging模块
import logging
# 创建一个日志器,就是一个logger对象
logger = logging.getLogger('logger')
# 设置logger输入级别
logger.setLevel(logging.DEBUG)
# 1.创建日志格式器
formator = logging.Formatter(fmt="%(asctime)s [ %(filename)s ] %(lineno)d行 | [ %(levelname)s ] | [%(message)s]",
datefmt="%Y/%m/%d/%X")
# 创建一个输出的处理器,让它输入到控制台
sh = logging.StreamHandler()
# 把输出处理器添加到日志器中
logger.addHandler(sh)
# 2.给处理器添加格式器
sh.setFormatter(formator)
# 输出日志信息
logger.debug('输出debug级别的日志')
logger.info('输出info级别的日志')
logger.warning('输出warning级别的日志')
logger.error('输出error级别的日志')
logger.critical('输出critical级别的日志')
"""
# 右键执行代码
# 结果如下:
2021/01/15/03:15:44 [ demo_log2.py ] 27行 | [ DEBUG ] | [输出debug级别的日志]
2021/01/15/03:15:44 [ demo_log2.py ] 28行 | [ INFO ] | [输出info级别的日志]
2021/01/15/03:15:44 [ demo_log2.py ] 29行 | [ WARNING ] | [输出warning级别的日志]
2021/01/15/03:15:44 [ demo_log2.py ] 30行 | [ ERROR ] | [输出error级别的日志]
2021/01/15/03:15:44 [ demo_log2.py ] 31行 | [ CRITICAL ] | [输出critical级别的日志]
"""
4、filter类用法
filter类
:filter
是一个过滤器,可以实现比logger
和handle
更细致灵活的过滤功能。
设置只输出符合过滤条件的日志记录,提供给Logger
类和Handler
类使用。
Logger
类默认过滤具有相同前缀的所有日志记录。
Logger
只有在处理日志记录时即时检查Filter
,所以继承Logger
不会检查Filter
。
Handler
首先注册Filter
,然后在处理后续日志记录时检查。
首先定义logging.Filter
的扩展类,并在其中实现def filter(self, record)
方法。然后创建定制Filter
类的实例,并通过addFilter()
方法附加到Logger
和Handler
。
『无为则无心』Python日志 — 65、日志模块logging的使用的更多相关文章
- 『无为则无心』Python日志 — 64、Python日志模块logging介绍
目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...
- 『无为则无心』Python日志 — 66、将日志信息保存到文件中
目录 1.把日志信息保存到文件中 2.拓展 (1)观察代码 (2)提出问题 (3)问题说明 1.把日志信息保存到文件中 代码如下所示: """ logging模块是Pyt ...
- 『无为则无心』Python日志 — 67、logging日志模块处理流程
目录 1.概括理解 2.详细说明 3.应用示例 1.概括理解 了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程: 也就是获取的日志信息,进入到Logger日志器中,传递给处理器确 ...
- 『无为则无心』Python基础 — 44、对文件和文件夹的操作
目录 1.os模块介绍 2.查看os模块相关文档 3.os模块常用方法 (1)文件重命名 (2)删除文件 (3)创建文件夹 (4)删除文件夹 (5)获取当前目录 (6)改变默认目录 (7)获取目录列表 ...
- 『无为则无心』Python日志 — 69、补充:logging.basicConfig()函数说明
目录 1.basicConfig()函数说明 2.应用 1.basicConfig()函数说明 此函数,通过创建一个带有默认Formatter(格式器)的StreamHandler(处理器),并将其添 ...
- 『无为则无心』Python基础 — 9、Python字符串的编码与转义
目录 1.查看变量类型 2.转义字符 (1)转义字符说明 (2)示例 (3)常用转义字符对照表 3.字符编码 (1)字符编码介绍 (2)Python中的字符编码 (3)编码格式应用于不同场景 提示:上 ...
- 『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别
目录 1.什么是计算机语言 2.高级语言中的编译型语言和解释型语言 (1)编译型语言 (2)解释型语言 (3)编译型语言和解释型语言执行流程 3.知识扩展: 4.关于Python 1.什么是计算机语言 ...
- 『无为则无心』Python基础 — 3、搭建Python开发环境
目录 1.Python开发环境介绍 2.Python解释器的分类 3.下载Python解释器 4.安装Python解释器 5.Python解释器验证 1.Python开发环境介绍 所谓"工欲 ...
- 『无为则无心』Python基础 — 4、Python代码常用调试工具
目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...
随机推荐
- 关于C++11共享数据带来的死锁问题的提出与解决
举个例子,如果有一份资源,假如为list<int>资源,假设有两个线程要对该资源进行压入弹出操作,如果不进行锁的话,那么如果两个线程同时操作,那么必然乱套,得到的结果肯定不是我们想要的结果 ...
- gorm中的基本查询
检索单个对象 GORM 提供了 First.Take.Last 方法,以便从数据库中检索单个对象.当查询数据库时它添加了 LIMIT 1 条件 // 获取第一条记录(主键升序) db.First(&a ...
- golang反射reflect机制用法
package main import ( "fmt" "reflect" ) type User struct { Id int Name string Ag ...
- Telegra.ph | 简洁的文章发布平台
https://telegra.ph 自由 Telegraph 并不强调内容管理方这一概念,真正做到了「人人都是媒体」.通过 Telegraph 发布的文章,理论上来说不会存在删除的危险,并且由于会产 ...
- python 小兵之小技巧
用for循环打印数字从1开始 for a in range(1,num+1): 用split切割字符串可以用索引选择部分 int(el.split("_")[1]) range 第 ...
- hadoop 支持 LZO 压缩配置
1)hadoop 本身并不支持 lzo 压缩,故需要使用 twitter 提供的 hadoop-lzo 开源组件.hadoop lzo 需依赖 hadoop 和 lzo 进行编译,编译步骤如下. 编译 ...
- sql 同步远程数据库(表)到本地
一)在同一个数据库服务器上面进行数据表间的数据导入导出: 1. 如果表tb1和tb2的结构是完全一样的,则使用以下的命令就可以将表tb1中的数据导入到表tb2中: insert into db2.tb ...
- springmvc 配置拦截器
package com.aaa.zxf.interceptor; import org.springframework.boot.autoconfigure.SpringBootApplication ...
- 多源最短路-Floyd
题目描述 时间限制:5.0s 内存限制:256.0MB 问题描述 给定\(n\)个结点两两之间的单向边的长度,求两两之间的最短路径. 输入格式 输入第一行包含一个整数\(n\),表示点数. 接下来\( ...
- Linux添加用户组和添加用户
1.用户组 添加组:groupadd 组名 [root@Server-n93yom ~]# groupadd dev [root@Server-n93yom ~]# cat /etc/group | ...