Python学习之日志模块详解
作者:渴望力量的哈士奇 发布时间:2022-06-24 09:20:22
OK,今天我们来学习一下 python 中的日志模块,日志模块也是我们日后的开发工作中使用率很高的模块之一,接下来们就看一看今天具体要学习日志模块中的那些内容吧。
日志的作用
说到日志,我们完全可以想象为现实生活中的日记。日记是我们平时记录我们生活中点点滴滴的一种方法,而日志我们可以认为是 程序的日记 ,程序的日记是用来记录程序的行为,一般来说我们可以通过日志记录一些程序的重要信息。
比如哪里报错了?报错原因是什么?这个时候我们就可以通过查看日志知道哪里出了什么错误,并且是什么原因造成的,这样就可以帮助我们快速查错并修复bug。
其实并不仅仅是错误的信息,我们还可以通过日志记录程序运行的状态。
日志的等级
既然明确了日志的作用,在平时的日志记录过程中我们可以根据自己不同的业务需要进行不同等级的日志的记录。
debug:可以帮助我们在平时的开发过程中,帮助我们查看一些输出的信息是否正确。它可以替代我们平时使用的 print() 函数。
info:它代表了一般的消息类信息,只是为了记录一些程序的行为,比如程序执行到了某个位置,进行一些简单的记录。
warnning:该等级是一种警告,一般来说程序不会出错,但是可能存在一定的潜在风险。
error:一般对应业务中出现了重大问题。比如异常或者业务逻辑不应该执行到某种情况。我们都可以通过error来进行记录。
critical:比 error 更严重的级别,不过一般来说 error 级别已经很严重了,所以 critical 很少使用。
logging 模块的使用
其实 logging 模块使用起来还是比较复杂的,不过我们初学乍道,只需要学习使用 logging.basicConfig 就可以满足我们最基本的日志记录功能。
接下来我们看一下 logging.basicConfig 需要传入哪些参数以及如何使用。
参数名 | 作用 | 举例 |
---|---|---|
lever | 日志输出的最低等级 | lever=logging.DEBUG |
format | 日志输出格式 | 见下文的 format 具体格式 |
filename | 存储位置 | filename=‘d://debug.log’ |
filemode | 输入模式 | filemode=“w” |
关于 lever ,lerver的作用是表示最低的日志等级记录。如上文中的 lever=logging.DEBUG ,就表示记录包含 DEBUG 级别在内的所有日志等级。
format具体格式如下:
格式符 | 含义 |
---|---|
%(levername)s | 日志级别名称 |
%(pathname)s | 当前执行程序的路径(即脚本所在的位置) |
%(filename)s | 执行脚本程序名 |
%(lineno)d | 日志当前的行号 |
%(asctime)s | 打印日志的时间 |
%(message)s | 日志信息 |
常用的日志 fromat 常用方案:fromat = '%(asctime)s %(filename)s[line:%(lineno)d] %(levername)s %(message)s'
logging 模块演示小案例
import logging
logging.basicConfig( # 针对 basicConfig 进行配置(basicConfig 其实就是对 logging 模块进行动态的调整,之后可以直接使用)
level=logging.INFO, # INFO 等级以下的日志不会被记录
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # 日志输出格式
filename='back.log', # 日志存放路径(存放在当前相对路径)
filemode='w', # 输入模式;如果当前我们文件已经存在,可以使用 'a' 模式替代 'w' 模式
# 与文件写入的模式相似,'w' 模式为没有文件时创建文件;'a' 模式为追加内容写入日志文件
)
logging.debug('这是一条 debug 信息')
logging.info('这是一条 日志记录 信息')
logging.warning('这是一条 警告 信息')
logging.error('这是一条 重大的错误 信息')
# >>> 执行结果如下图
上面我们使用的 filemode 模式是 'w' 模式,现在我们改为 'a' 模式,尝试将日志追加进入 back.log 文件。
import logging
logging.basicConfig( # 针对 basicConfig 进行配置(basicConfig 其实就是对 logging 模块进行动态的调整,之后可以直接使用)
level=logging.INFO, # INFO 等级以下的日志不会被记录
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # 日志输出格式
filename='back.log', # 日志存放路径(存放在当前相对路径)
filemode='a', # 输入模式;如果当前我们文件已经存在,可以使用 'a' 模式替代 'w' 模式
# 与文件写入的模式相似,'w' 模式为没有文件时创建文件;'a' 模式为追加内容写入日志文件
)
logging.debug('这是一条 debug 信息 ---> \'a\' 模式第二次写入')
logging.info('这是一条 日志记录 信息 ---> \'a\' 模式第二次写入')
logging.warning('这是一条 警告 信息 ---> \'a\' 模式第二次写入')
logging.error('这是一条 重大的错误 信息 ---> \'a\' 模式第二次写入')
# >>> 执行结果如下图
这里关于文件是否存在,使用 ‘w’ 模式还是 ‘a’ 模式,我们完全可以通过 os 模块进行路径文件的判断,所以我们针对上文的脚本再进行优化一下。
import logging
import os
def init_log(path):
if os.path.exists(path):
mode = 'a'
else:
mode = 'w'
logging.basicConfig( # 针对 basicConfig 进行配置(basicConfig 其实就是对 logging 模块进行动态的调整,之后可以直接使用)
level=logging.INFO, # INFO 等级以下的日志不会被记录
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # 日志输出格式
filename='back.log', # 日志存放路径(存放在当前相对路径)
filemode=mode, # 输入模式;如果当前我们文件已经存在,可以使用 'a' 模式替代 'w' 模式
# 与文件写入的模式相似,'w' 模式为没有文件时创建文件;'a' 模式为追加内容写入日志文件
)
return logging
current_path = os.getcwd()
path = os.path.join(current_path, 'back.log')
log = init_log(path) # 初始化返回的 init_log() 函数 , 其实就是 return logging
log.debug('这是一条 debug 信息 ---> 第三次写入')
log.info('这是一条 日志记录 信息 ---> 第三次写入')
log.warning('这是一条 警告 信息 ---> 第三次写入')
log.error('这是一条 重大的错误 信息 ---> 第三次写入')
# >>> 执行结果如下图:
来源:https://blog.csdn.net/weixin_42250835/article/details/123781776
猜你喜欢
- 摘要global 标志实际上是为了提示 python 解释器,表明被其修饰的变量是全局变量。这样解释器就可以从当前空间 (curr
- 本文实例讲述了JavaScript导出Excel的方法。分享给大家供大家参考。具体实现方法如下:<html xmlns="h
- MySQL数据库中文问题的解决方法:1.my.ini MySQL配置文件设置[client]default-character-set=gb
- W3C(万维网联盟)日前发布了HTML 5公共草案,这是10年来对HTML的一次主要升级。据国外媒体报道,W3C HTML5草案于本周二发布
- 1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip,下载 .tar.gz压缩包1.2&
- 1. 排序有什么用“排序”这个专业名词原本是来源于计算机程序操作中的,是一种很常见的算法设计,当然,对交互设计来说,探讨冒泡排序和堆排序之间
- 我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,
- 概述编程的内核是数学,而测试的本质是计算,专业名词叫容量预估,而测试的大体就是用程序模拟程序,检测程序的正确性,有两个点需要注意,QPS最佳
- 本文实例讲述了python实现获取单向链表倒数第k个结点的值。分享给大家供大家参考,具体如下:#初始化链表的结点class Node():
- 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")
- 校验是否全由数字组成function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.
- 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是mysql的默认连接数引起的问题,一查果然,老天,默认
- 1.使用iloc对数据进行批量修改使用iloc最简单的就是将数据批量修改为某个特定的值以下是我随便写入的数据:现在将[‘
- 现在我们已经很熟悉Django的MTV模式了。模板(template)负责如何去展示数据,而视图(view)负责筛选出正确的数据。因此通常来
- 用analyze进行处理,定期进行处理ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name
- 随着PHP4.0和JSP技术的推出以及IIS中不断出现的重大的安全问题,MicroSoft的ASP的市场仿佛是变的狭窄了,但是 MicroS
- 远程(如通过互联网)连接access数据库的示例:首先,需要使用TCP/IP,ADO及XML(需要安装Microsoft XML 4.0。)
- scrapy框架概述:Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数
- 前言Python包含6种内置的序列:列表、元组、字符串 、Unicode字符串、buffer对象、xrange对象。在序列中的每个元素都有自
- 由传智播客教程整理,我们这里使用的是python2.7.x版本,就是2.7之后的版本,因为python3的改动略大,我们这里不用它。现在我们