你还在用print调试程序吗?太low了
Posted 奋斗丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你还在用print调试程序吗?太low了相关的知识,希望对你有一定的参考价值。
前言
你还在用print来调试程序吗?当我们的程序较为简单,只需在控制台上输出一些信息时,使用print来打印一些信息来帮我们调试程序,这无可厚非。但是当我们的项目很复杂,需要在很多个地方输出一些信息,包括在文件中等地方,使用很多个print会显得自己很不专业。日志是每个项目中不可缺少的部分,重要性不言而喻。使用日志的目的有三,其一,使用日志可以帮助我们调试程序;其二,日志信息可以快速帮助我们定位出错误;其三,使用日志可以帮我们记录一些数据,以便后期的数据分析。
一、logging的基础使用
1.1 基础知识
级别 | 级别数值 | 使用时机 |
---|---|---|
DEBUG | 10 | 详细信息,常用于调试 |
INFO | 20 | 程序正常运行过程中产生的一些信息 |
WARNING | 30 | 警告用户,虽然程序还在正常工作,但有可能发生错误 |
ERROR | 40 | 由于更严重的问题,程序已经不能执行一些任务 |
CRITICAL | 50 | 严重错误,程序已经不能继续运行 |
优先级为:CRITICAL > ERROR > WARNING > INFO > DEBUG
默认的日志级别为WARRING,即DEBUG和INFO的输出信息不会输出,只会输出CRITICAL、 EROOR和WARNING信息
1.2 案例1
# 导包
import logging
logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')
1.3 案例2 --指定日志的输出级别
# 导包
import logging
# 指定日志的级别
logging.basicConfig(level=logging.INFO)
logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')
1.4 案例3–向文件中写入日志信息
import logging
# 默认为追加模式
logging.basicConfig(filename='demo.log', level=logging.DEBUG)
# 更改写入模式:该模型为先清空文件内容,然后写入新内容
logging.basicConfig(filename='demo.log','w',level=logging.DEBUG)
logging.DEBUG('debug')
logging.INFO('info')
logging.WARNING('warning')
logging.ERROR('error')
logging.CRITICAL('critical')
首先会创建‘demo.log’文件,然后写入日志信息。
1.5 案例4–日志输出变量信息
import logging
name = 'djk'
age = 12
logging.basicConfig(level=logging.DEBUG)
# 格式化变量的几种方式
logging.debug('姓名 %s 年龄 %d', name,age)
logging.debug('姓名 %s 年龄 %d'% (name,age))
logging.debug('姓名 年龄 '.format(name,age))
logging.debug(f'姓名 name 年龄 age')
1.6 案例5–日志信息格式化
import logging
logging.basicConfig(fotmat='#(asctime)s|%(levelname)s|%(lineno)s|%(message)s', datefmt ='%Y %m %d %H %M %S',level=logging.DEBUG)
这样,输出的日志信息就能按照我们自己的意愿来输出对应的信息了。
二、编程式方法实现日志应用
logging模块采用了模块化设计,主要包含四种组件:
- Loggers:记录器,提供应用程序代码能直接使用的接口
- Handles:处理器,将记录器产生的日志发送至目的地
- Filters:过滤器,提供更好的粒度控制,决定哪些日志会被输出
- Formatters:格式化器,设置日志内容的组成结构和消息字段
步骤:
- 1.创建一个logger并设置默认等级
- 2.创建Handler,并设置日志级别。值得注意的是:一个logger可以有多个handler
- 3.自定义日志格式
- 4.为记录器设置日志格式
- 5.为处理器设置日志格式
- 6.关联记录器和处理器
- 7.(非必需)创建一个Filter
- 8.关联Logger和Filter
- 9.关联Handler和Filter
import logging
# 1.创建记录器并设置日志级别
logger = logging.getLogger('applog') # 创建一个记录,名字为applog
logging.basicConfig(level=logging.DEBUG) # 指定记录器的日志级别
# 2.定义处理器及设置日志级别
consolehandler = logging.StreamHandler() # 创建一个控制台处理器
consolehandler.setLevel(logging.DEBUG)
filehandler = logging.FileHandler(filename='demo.log')
filehandler.setLevel(logging.DEBUG)
# 3.设置日志输出格式
formatter = logging.Formattter('%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s') # 创建日志格式
# 4.为处理器设置日志格式
consolehandler.setFormatter(formatter)
filehandler.setFormatter(formatter)
# 5.关联记录器和处理器
logger.addHandler(consolehandler)
logger.addHandler(filehandler)
# 6.定义Filter
flt = logging.FileHandler('demo')
# 7.关联记录器和过滤器
logger.addFilter(flt)
# 8.关联处理器和过滤器
consolehandler.addFilter(flt)
filehandler.addFiliter(flt)
# 9.这里是logger这个对象,并不是logging这个库了
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
Formatters的常用格式
属性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志产生的时间,默认格式为2021-11-27 20:53:45, 896 |
filename | %(filename)s | 生成日志的程序名 |
levelname | %(levelname)s | 当前日志级别 |
levelno | %(levelno)s | 日志级别对应的数值 |
lineno | %(lineno)s | 日志所针对的代码行号 |
message | %(message)s | 具体的日志信息 |
当然还有其它的格式,但是目前来说用不着,为简洁,故本文中没有出现,大家可以根据自己的需求进行查询。
三、 配置文件的方式实现日志设置
首先,我们需要先配置一个日志文件,命名为logging.config,如下所示:
[loggers]
keys=root,applog
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_applog]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=applog
propagate=0
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatters=simpleFormatter
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
args=('applog.log','midnight',1,0)
level=DEBUG
formatters=simpleFormatter
[formatter_simpleFormatter]
format=%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s
datafmt=%Y-%m-%d %H:%M:%S
import logging.config
# 导入该日志配置文件
logging.config.fileConfig('demo.log')
logger = logging.getLogger('applog') # 创建一个名为applog的Logger
logger.debug('你学会了吗?')
案例
下面,我们使用一个简单的案例来讲解一下日志具体是如何使用的!假设,我输入下面的语句:
name='djk'
int(name)
如果单纯的运行以上这两条语句,很明显会出现以下错误:
但我们如果使用日志:
import logging
logger = logging.getLogger('applog')
name='djk'
try:
int(djk)
catch Exception as e:
logger.exception(e)
可以看到,已经记录到日志中。
以上是关于你还在用print调试程序吗?太low了的主要内容,如果未能解决你的问题,请参考以下文章