module-logging

Python的logging模块提供了一套完整日志系统,包括记录器(Logger)、处理器(Handler)、过滤器(Filter)和格式化器(Formatter)。Logger是日志记录的起点,有多种级别如DEBUG、INFO、WARNING等,并可通过getLogger()创建。Handler决定日志的输出目的地,如StreamHandler、FileHandler。Filter用于过滤日志,而Formatter设置日志格式。logging.basicConfig()可方便地初始化日志系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Python的logging模块提供了通用的日志系统,这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现方式记录日志。
#导入logging模块
import logging
logging模块官方文档:https://docs.python.org/3.5/library/logging.html?

logging构成

logging模块包括logger,Handler,Filter,Formatter四个部分。
· Logger 记录器,用于设置日志采集。
· Handler 处理器,将日志记录发送至合适的路径。
· Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
· Formatter 格式化器,指明了最终输出中日志的格式。

Logger 记录器

Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical;使用之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),Handler和Formatter。

1.logging.getLogger(name=None)

返回一个logger对象并指定name为名字,如果为指定名字则返回root记录器

2.setLevel(self, level)

设置日志级别,level必须是int或str类型

3.debug(self, msg, *args, **kwargs)

打印日志debug信息,传递异常信息,使用exc_info这个参数
例如:logger.debug(“Houston, we have a %s”, “thorny problem”, exc_info=1)

4.info(self, msg, *args, **kwargs)

打印日志info信息,传递异常信息,使用exc_info这个参数
例如:logger.info(“Houston, we have a %s”, “interesting problem”, exc_info=1)

5.warning(self, msg, *args, **kwargs)

打印日志warning信息,传递异常信息,使用exc_info这个参数
例如:logger.warning(“Houston, we have a %s”, “bit of a problem”, exc_info=1)

6.error(self, msg, *args, **kwargs)

打印日志error信息,传递异常信息,使用exc_info这个参数
例如:llogger.error(“Houston, we have a %s”, “major problem”, exc_info=1)

7.critical(self, msg, *args, **kwargs)

打印日志critical信息,传递异常信息,使用exc_info这个参数
例如:logger.critical(“Houston, we have a %s”, “major disaster”, exc_info=1)

8.addHandler(self, hdlr):

将制定的日志处理对象添加到记录器中

9.removeHandler(self, hdlr):

从记录器中移除一个日志处理对象

10.hasHandlers(self):

查看此记录器是否配置了任何处理程序,有返回True,没有返回False

11.getEffectiveLevel(self):

获取此记录器的有效级别

12.isEnabledFor(self, level):

判断记录器级别是否为level,level为整数
critical:50
error:40
warning:30
info:20
debug:10
hotset:0

13.logging.basicConfig(**kwargs)

为日志记录系统做基本配置,如果根记录器已具有处理程序,则此函数不执行任何操作,是一种方便的方法,用于简单的脚本对日志包进行一次性配置
例子:
logging.basicConfig(
level=logging.DEBUG, #设置日志级别 ,将级别设置为debug
filename=“logger.log”, #设置日志保存文件,文件名为logger.log
filemode=“w”, #设置日志保存文件打开方式,w清空编写,a追加
format="%(asctime)s “, #设置日志打印格式,格式为%(name)s,name代表变量
datefmt=”", #设置时间格式
stream=, #指定stream创建StreamHandler,可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
)
filemode 指定打开文件的模式,如果指定了filename(如果文件模式未指定,则默认为’a)
Tips:文件读写模式
· w 以写方式打开,
· a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
· r+ 以读写模式打开
· w+ 以读写模式打开 (参见 w )
· a+ 以读写模式打开 (参见 a )
logging_test.py

import logging
 
# logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.INFO)
 
logging.debug('debug info')
logging.info('hello 51zxw !')
logging.warning('warning info')
logging.error('error info')
logging.critical('critical info')
Handler 处理器

Handler 处理器,将日志记录发送至合适的路径,Handler处理器类型有很多种,比较常用的有三个:

1.StreamHandler

继承Handler类,将日志记录输出发送到诸如sys.stdout,sys.stderr或任何类似文件流的对象。上面例子就是输出到控制台

2.FileHandler

继承Handler类,将日志记录输出发送到磁盘文件。 它继承了StreamHandler的输出功能。

3.NullHandler

继承Handler类,不做任何格式化或输出。 它本质上是一个开发人员使用的“无操作”处理程序。

4.Handler.createLock(self):

获取线程锁以序列化对底层I/O的访问

5.Handler.acquire(self):

获取I/O线程锁

6.Handler.release(self):

释放I/O线程锁

7.Handler.setLevel(self, level):

设置此处理程序的日志记录级别。level必须是int或str

8.Handler.format(self, record):

格式化指定的记录。如果设置了格式化程序,请使用它。否则,对于模块,请使用默认格式设置工具

9.Handler.handle(self, record):

有条件地发出指定的日志记录。释放取决于可能已添加到处理程序中的过滤器。用获取/发布I/O线程锁。返回筛选器是否传递了的记录释放。

10.Handler.setFormatter(self, fmt):

设置格式化程序,fmt为Formatter的对象

Filter 过滤器

Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。

Formatter

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

格式描述
%(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.Formatter(’%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s’)
输出结果:
2018-04-19 17:25:04,679 logging_test.py[line:12] DEBUG debug info
2018-04-19 17:25:04,680 logging_test.py[line:13] INFO hello 51zxw 2020
2018-04-19 17:25:04,680 logging_test.py[line:14] WARNING waning info
2018-04-19 17:25:04,680 logging_test.py[line:15] ERROR error info
2018-04-19 17:25:04,680 logging_test.py[line:16] CRITICAL critical info

日志级别:

脚本运行会有很多的情况,比如调试信息、报错异常信息等。日志要根据这些不同的情况来继续分级管理,不然对于排查问题的筛选会有比较大的干扰。 。日志一般定位的级别如下:

级别何时使用
DEBUG调试信息,也是最详细的日志信息
INFO证明事情按预期工作
WARNING表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作
ERROR由于更严重的问题,软件已不能执行一些功能了
CRITICAL严重错误,表明软件已不能继续运行了

首先我们日志需要按照info、debug、error等级别来进行区分的。当然这个级别可以自己去设置。在一般的情况下我们普通的输出我们直接用info类型,调试的时候用debug类型,如果预计有错误时那么我们就需要用error类型的日志,一般情况去info级别最为合适。
critical(50)>error(40)>warning(30)>info(20)>debug(10)>hotset(0);
日常工作,尽量保留error和critical,考虑性能和硬盘存储方面
注意:只有【当前写等级】大于【日志等级】时,日志文件才被记录;默认级别是warning,将warning以上包含warning的日志输出

日志格式

日志格式化是为了提高日志的可阅读性,比如:时间+模块+行数+日志具体信息 的内容格式。如果日志信息杂乱无章的全部输出来,这样也不利于定位问题。如下所示就是日志格式化输出,非常便于阅读查看。
2018-01-10 18:02:35,633 backup.py[line:18] INFO test backup====
2018-01-10 18:02:39,253 backup.py[line:20] INFO click backup button
2018-01-10 18:02:54,025 backup.py[line:23] INFO click next button
2018-01-10 18:03:09,280 common_fun.py[line:83] INFO Start send Email…
2018-01-10 18:03:11,840 common_fun.py[line:91] INFO Send Email finish!
2018-01-10 18:03:13,305 common_fun.py[line:168] INFO get backup screenshot
2018-01-10 19:36:00,238 backup.py[line:17] INFO test backup====
2018-01-10 19:36:04,530 backup.py[line:19] INFO click backup button
2018-01-10 19:37:20,107 backup.py[line:17] INFO ============test

例子:

A.例子1

import logging
logging.basicConfig(filename='access.log',
                    format='%(asctime)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)
logging.debug('调试debug')    
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')

B.例子2:

import logging
#1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
logger=logging.getLogger(__file__)
#2、Filter对象:不常用,略
#3、Handler对象:接收logger传来的日志,然后控制输出
h1=logging.FileHandler('t1.log') #打印到文件
h2=logging.FileHandler('t2.log') #打印到文件
h3=logging.StreamHandler() #打印到终端
#4、Formatter对象:日志格式
formmater1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater2=logging.Formatter('%(asctime)s :  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater3=logging.Formatter('%(name)s %(message)s',)
#5、为Handler对象绑定格式
h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
h3.setFormatter(formmater3)
#6、将Handler添加给logger并设置日志级别
logger.addHandler(h1)
logger.addHandler(h2)
logger.addHandler(h3)
logger.setLevel(10)  #设置打印级别
#7、测试
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值