Python logging模块handlers用法详解


Posted in Python onAugust 14, 2020

一、handlers是什么?

logging模块中包含的类

用来自定义日志对象的规则(比如:设置日志输出格式、等级等)

常用3个子类:StreamHandler、FileHandler、TimedRotatingFileHandler

二、handlers基础应用

2.1 StreamHandler 控制台输出日志

import logging

#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #设置默认的日志级别

#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#创建StreamHandler对象
sh = logging.StreamHandler()
#StreamHandler对象自定义日志级别
sh.setLevel(logging.DEBUG)
#StreamHandler对象自定义日志格式
sh.setFormatter(formatter)

logger.addHandler(sh)  #logger日志对象加载StreamHandler对象
#日志输出
logger.info('newdream')

上面代码执行后,会在控制台输出日志信息。

2.2 FileHandler 日志输出到文件

import logging

#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #设置默认的日志级别

#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#创建FileHandler对象
fh = logging.FileHandler('test.log')
#FileHandler对象自定义日志级别
fh.setLevel(logging.DEBUG)
#FileHandler对象自定义日志格式
fh.setFormatter(formatter)

logger.addHandler(fh)  #logger日志对象加载FileHandler对象
#日志输出
logger.info('newdream')

上面代码执行后,控制台不会输出日志信息,而会在当前文件夹新建一个test.log日志文件进行日志记录。

2.3 TimedRotatingFileHandler 日志分割

import logging
from logging import handlers

#创建一个logger日志对象
logger = logging.getLogger('test_logger')
logger.setLevel(logging.DEBUG)  #设置默认的日志级别

#创建日志格式对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#创建TimedRotatingFileHandler对象
rh = handlers.TimedRotatingFileHandler("test.log", when='S', interval=1, backupCount=5)
#TimedRotatingFileHandler对象自定义日志级别
rh.setLevel(logging.DEBUG)
#TimedRotatingFileHandler对象自定义日志级别
rh.suffix = "%Y_%m_%d_%H_%M_%S.log"
#TimedRotatingFileHandler对象自定义日志格式
rh.setFormatter(formatter)

logger.addHandler(rh)  #logger日志对象加载TimedRotatingFileHandler对象
#日志输出
logger.info('newdream')

上面代码执行后,控制台不会输出日志信息,而会在当前文件夹新建一个 test_年_月_日_时_分_秒.log 日志文件进行日志记录。

在使用TimedRotatingFileHandler创建对象时,它的构造函数定义如下:

  • TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
  • filename:是输出日志文件名的前缀,比如log/myapp.log
  • when:按什么日期格式切分,接收指定字符串参数,接收的值如下:

“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval 是指等待多少个单位when的时间后,Logger会自动重建文件,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义不能因为when而重复。
backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设为5,则在文件的创建过程中库会判断是否有超过这个5,若超过,则会从最先创建的开始删除。

三、小结

以上的日志实例为了让读者更清晰的操作和理解,分开代码单独实现

在 2.3 中 如果想实现看是否达到5个日志就删除的效果,可以把日志用循环输出,如下:

while True:
logger.info('newdream')

三种handlers日志可以共同使用,都是独立的handler对象,但一般 FileHandler 和 TimedRotatingFileHandler 不会同时使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python中return self的用法详解
Jul 27 Python
python实现梯度下降算法
Mar 24 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python脚本后台执行方式
Dec 21 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
浅谈Python描述数据结构之KMP篇
Sep 06 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
浅谈Python类的单继承相关知识
May 12 Python
pytorch DataLoader的num_workers参数与设置大小详解
May 28 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
Python代码注释规范代码实例解析
Aug 14 #Python
Python发送邮件实现基础解析
Aug 14 #Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 #Python
Python编写memcached启动脚本代码实例
Aug 14 #Python
Python自动巡检H3C交换机实现过程解析
Aug 14 #Python
基于python调用jenkins-cli实现快速发布
Aug 14 #Python
使用tensorflow进行音乐类型的分类
Aug 14 #Python
You might like
php递归json类实例
2014/12/02 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
详解Bootstrap插件
2016/04/25 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
git进行版本控制心得详谈
2017/12/10 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
会计电算化专业毕业生自荐信
2013/12/20 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书