python进阶----logging模块
在工作中经常要打印一些日志,下面介绍一下python中的logging模块
首先,先了解一下日志的级别,主要分为以下5种:
debug 最低级别,一般开发用来打印一些调试信息
info 正常输出信息,一般用来打印一下正常的操作
warning 一般用来打印报警信息
error 一般打印一些错误信息
critical 一般打印一些致命的错误信息
logging模块中主要有四个类
logger 记录器,应用程序可以通过logger提供的api记录日志,相当于创建一个办公室,让员工在里面工作
handler 处理器 ,处理日志信息,可以将日志保存或者显示在不同的目标区域
filter 过滤器
formatter 日志格式化
日志的输出格式
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
工作中给的常用格式:
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。
写日志功能的简单实现
import logging
logging.basicConfig(level=logging.ERROR,#大写表示常量
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',#日志输出格式
filename='a.log',#日志输出到哪个文件
filemode='a'#以追加的形式写入文件 )
logging.debug('我是debug')
logging.info('我是info')
logging.warning('我是warning')
logging.error('我是error')
logging.critical('我是critical')
注意了:日志级别排列:debug<info<warning<error<critical,选择了日志级别后,打印该级别以及比这个级别高的日志的内容
上述基本实现了log的写入功能,但是用个问题:日志只是写入了文件,但是在终端中显示不出来,怎样可以两者兼顾呢?
使用logging模块下的handlers
1.创建一个logger对象,相当于创建一个办公室
Logger = logging.getLogger()
2.设置日志的级别
Logger.setLevel(logging.DEBUG)
3.定义日志输出格式
fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
4.实例化两个对象,StreamHandler 负责在屏幕上显示日志 / TimedRotatingFileHandler 负责向文件中写日志
t = logging.StreamHandler() #实例化StreamHandler,相当于找一个人给你干活 往屏幕上输出
st.setFormatter(fmt) #设置屏幕上显示的格式
th = handlers.TimedRotatingFileHandler(
'my.log',when='d',encoding='utf-8',backupCount=5
#第一个参数是文件名,第二个 when是隔多久生成一个日志,backupCount就是保存几个日志文件
) #实例化TimedRotatingFileHandler 相当于找一个人给你干活 往文件里面写东西
th.setFormatter(fmt)#设置文件里面写入的格式
5.将两个对象加入logger中
Logger.addHandler(st) #把这两个对象加入到logger里面,也就是把干活的人塞到办公室里面
Logger.addHandler(th)
6.打印log
Logger.debug('my_log debug 信息')
Logger.info('my_log info 信息')
Logger.warning('my_log warning 信息')
Logger.error('my_log error 信息')
完整代码如下:
import logging
from logging import handlers Logger = logging.getLogger() #创建一个办公室
Logger.setLevel(logging.DEBUG) #设置日志级别
fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')#定义格式
st = logging.StreamHandler() #实例化StreamHandler,相当于找一个人给你干活 往屏幕上输出
st.setFormatter(fmt) #设置屏幕上显示的格式
th = handlers.TimedRotatingFileHandler(
'my.log',when='d',encoding='utf-8',backupCount=5
#第一个参数是文件名,第二个 when是隔多久生成一个日志,backupCount就是保存几个日志文件
) #实例化TimedRotatingFileHandler 相当于找一个人给你干活 往文件里面写东西
th.setFormatter(fmt)#设置文件里面写入的格式
Logger.addHandler(st) #把这两个对象加入到logger里面,也就是把干活的人塞到办公室里面
Logger.addHandler(th)
Logger.debug('my_log debug 信息')
Logger.info('my_log info 信息')
Logger.warning('my_log warning 信息')
Logger.error('my_log error 信息')
最后封装成一个类,可以以后可以直接使用
import logging
from logging import handlers
class Logger(object):
level_relations = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'crit': logging.CRITICAL
} # 日志级别关系映射
def __init__(self,filename,level='info',
when='D',
back_count=3,
fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
self.logger = logging.getLogger(filename)
# 分割日志的单位 S 秒、M 分、 H 小时、 D 天、 W 每星期(interval==0时代表星期一)、midnight 每天凌晨
format_str = logging.Formatter(fmt) #设置日志格式
self.logger.setLevel(self.level_relations.get(level)) #设置日志级别
sh = logging.StreamHandler()
sh.setFormatter(format_str)
th = handlers.TimedRotatingFileHandler(filename=filename,when=when,
backupCount=back_count,encoding='utf-8')
th.setFormatter(format_str)
self.logger.addHandler(sh)
self.logger.addHandler(th)
if __name__ == '__main__':
log = Logger('haha.log')
log.logger.debug('i的是100')
log.logger.info('hello wold')
log.logger.warning('waring message')
log.logger.error('error le ')
python进阶----logging模块的更多相关文章
- Python之logging模块
一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...
- python的logging模块
python提供了一个日志处理的模块,那就是logging 导入logging模块使用以下命令: import logging logging模块的用法: 1.简单的将日志打印到屏幕上 import ...
- python的logging模块之读取yaml配置文件。
python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...
- python中logging模块的用法
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- python基础--logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- Python中logging模块的基本用法
在 PyCon 2018 上,Mario Corchero 介绍了在开发过程中如何更方便轻松地记录日志的流程. 整个演讲的内容包括: 为什么日志记录非常重要 日志记录的流程是怎样的 怎样来进行日志记录 ...
- python之logging模块简单用法
前言: python引入logging模块,用来记录自己想要的信息.print也可以输入日志,但是logging相对print来说更好控制输出在哪个地方.怎么输出以及控制消息级别来过滤掉那些不需要的信 ...
- Python进阶----pymysql模块的使用,单表查询
Python进阶----pymysql模块的使用,单表查询 一丶使用pymysql 1.下载pymysql包: pip3 install pymysql 2.编写代码 ...
- Python进阶(八)----模块,import , from import 和 `__name__`的使用
Python进阶(八)----模块,import , from import 和 __name__的使用 一丶模块的初识 #### 什么是模块: # 模块就是一个py文件(这个模块存放很多相似的功能, ...
随机推荐
- JAVA遇见HTML——JSP篇(JavaBeans)
1.像使用普通java类一样,创建javabean实例,利用构造方法创建实例 跟表单关联,“*”表示根据名称来进行匹配,就是根据表单所提交过来的参数的名字和Javabean当中的属性名字来进行一一匹配 ...
- Oracle 多表联合删除?--转
oracle和mysql多表删除数据的方法一大把,好多都是没经过证实的,你很可能已经被错误信息误导了,下面我以mysql两张表删除数据为例,来让给为注意到这一点,我在mysql中新建了两张表,分别是用 ...
- JavaScript 基础知识 - BOM篇
前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...
- Qt 把连续两次单击当成双击
方法1: 主要通过计时器,在一段时间内的连续两次单击,触发双击事件 void init() { m_nClickCount = 0; m_timer = new QTimer(this); conne ...
- SIGAI机器学习第七集 k近邻算法
讲授K近邻思想,kNN的预测算法,距离函数,距离度量学习,kNN算法的实际应用. KNN是有监督机器学习算法,K-means是一个聚类算法,都依赖于距离函数.没有训练过程,只有预测过程. 大纲: k近 ...
- 【基本算法入门-字符串哈希(Hash)】-C++
字符串哈希入门 说得通俗一点,字符串哈希实质上就是把每个不同的字符串转成不同的整数. 为什么会有这样的需要呢?很明显,存储一个超长的字符串和存储一个超大但是能存的下的整数,后者所占的空间会少的多,但主 ...
- Laravel API Errors and Exceptions: How to Return Responses
Laravel API Errors and Exceptions: How to Return Responses February 13, 2019 API-based projects are ...
- spring 定时任务的 执行时间设置规则-----看完这篇就懂了
单纯针对时间的设置规则 org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpressi ...
- MySQLSyntaxErrorException: Table 'taotao.tbuser' doesn't exist
先看看表名是不是有下划线,再看看实体类有没有@TableName("tb_user") 逆向生成代码里添加设置
- CKEditor本地图片自动上传插件
由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...