优雅地记录Python程序日志2:模块组件化日志记录器
本文摘自:https://zhuanlan.zhihu.com/p/32043593
本篇将会涉及:
- logging的各个模块化组件
- 构建一个组件化的日志器
logging的模块组件化
在上一篇文章中,我们介绍了Python的内置模块logging的使用,通过短短的几行代码我们就实现了一个日志记录器。。
import logginglogging.basicConfig(level=logging.INFO,filename='test.log',format="%(levelname)s:%(asctime)s:%(message)s")
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
在上面的例子中我们直接使用了logging模块提供的简单日志记录器。除此之外,logging模块还提供了模块化的方法,通过日志记录器、日志处理器、过滤器和格式处理器等组件来灵活的配置日志器:
- 日志记录器Loggers提供程序调用日志记录的接口;
- 日志处理器Handlers用于将日志记录器创建的日志记录发送到相应的目标上;
- 过滤器Filters提供了对日志记录进行更详细的输出;
- 格式器Formatters用于指定输出的日志记录的最终格式;
在前面的例子中我们知道,一条日志记录是通过调用一个日志记录器(Logger类的实例)的方法来执行的。每一个日志记录器都有一个name来标识这个日志记录器,比如上一篇文章中我们创建的日志记录起的name就是默认的root。
日志记录器
通过logging的getLogger()方法,我们可以创建一个日志记录器,并指定其名称:
log = logging.getLogger("test_logger")
这样我们就实例化了一个名为test_logger的日志记录器。这个日志记录器除了包含一些基本的功能,比如调用各级别的日志方法外,还能够添加日志处理器、过滤器等。
日志处理器
日志处理器Handlers负责将相应的日志记录消息分发到指定的目标上。在logging模块中,有很多种日志处理器用于不同的用途,下面介绍几个常用的:
- StreamHandler:用于将日志消息发送到控制台;
- FileHandler:用于将日志消息写入文件中;
- SMTPHandler:用于将日志消息发送到指定的电子邮箱;
- HTTPHandler:使用GET或POST方法将日志消息发送给某个HTTP服务器;
其中我们最常使用的,还是FileHandler处理器,将日志消息写入文件中。
使用logging.FileHandler()可以创建一个FileHandler处理器处理器:
logHandler = logging.FileHandler(filename='log.log')
我们在此创建了一个FileHandler处理器,并指定日志的文件名为log.log。
在创建日志处理器之后,可以通过日志记录器的addHandler()方法,将处理器添加到记录器中。
log.addHandler(logHandler)
日志格式器
在上一篇文章中,我们通过logging.basicConfig()的format参数来指定输出日志消息的格式。而在模块组件化中,我们使用logging.Formatter()方法来创建一个日志格式器。
formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',datefmt='%Y/%m/%d %I:%M:%S %p')
在创建之后,可以通过日志处理器的setFormatter()方法,将日志格式器添加到日志处理器中:
logHandler.setFormatter(formats)
这样,我们就基本组装好了一个模块化的日志器。接着就能够在程序中调用日志记录器的方法来记录日志:
import loggingdef mylog():print(inspect.stack()[0])# 创建一个日志记录器log = logging.getLogger("test_logger")log.setLevel(logging.DEBUG)# 创建一个日志处理器logHandler = logging.FileHandler(filename='log.log')logHandler.setLevel(logging.DEBUG)# 创建一个日志格式器formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',datefmt='%Y/%m/%d %I:%M:%S %p')# 将日志格式器添加到日志处理器中logHandler.setFormatter(formats)# 将日志处理器添加到日志记录器中log.addHandler(logHandler)return log# 输出日志
log = mylog()
log.info("这是一个普通信息")
log.debug("这是一个调试信息")
log.warning("这是一个警告信息")
log.error("这是一个错误信息")
log.critical("这是一个危险信息")
运行程序的结果如下:
转载于:https://www.cnblogs.com/GavinSimons/p/9143386.html
优雅地记录Python程序日志2:模块组件化日志记录器相关推荐
- python代码执行过程记录_优雅的记录Python程序日志
1 本篇概要 logging模块的调用: 保存log日志为文件: 调整输入日志等级: 修改日志消息格式: 2 前言 在使用Python编写程序的过程中,我们经常使用print()函数打印一些信息到控制 ...
- 如何优雅地退出python程序
如何优雅地退出python程序 一个单模的Python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. [python] view ...
- python程序员的工作内容_每个Python程序员都要知道的日志实践
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cp ...
- python程序调试logging_python-logging模块的简单使用
本人是新手程序员,写文章是为了记录学习,文章中多有错误,还望大家谅解,并指出问题. 本文用到的技术与工具:python,pycharm,logging等. 最近写了一个程序demo,一天24小时挂着跑 ...
- python利用什么写模板_利用python自动生成verilog模块例化模板
一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受"利奇马"的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口 ...
- 微信小程序 基础3【组件化开发、自定义组件、全栈开发、使用Express】
视频地址: https://www.bilibili.com/video/BV1cW411T7t6 [2018]学做小程序- 清华大学 https://www.bilibili.com/video/ ...
- 58 同城 iOS 客户端搜索模块组件化实践
[编者按]58 同城 App 自从 1.0 版本开始,便已经提供了搜索功能.随着版本的迭代.业务的复杂,搜索框架也在不断受到挑战.诸如代码不能复用.耦合度高.业务功能接入成本高等问题日积月累,成为需要 ...
- python中自定义模块导入飘红_hadoop streaming 中跑python程序,自定义模块的导入
今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题:不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件 ...
- [填坑手册]小程序目录结构和组件化使用心得
小程序目录结构 关于小程序的目录结构,可以说一开始大家都有各自的开发习惯和命名规则,但一旦项目变得复杂庞大的时候,你就发现管理起来和后期维护变得很麻烦,如果是 协同开发 的话,更容易出现 " ...
最新文章
- 学习AI方向大半年,为什么你还没有别人几个月更精通?
- docker 僵尸进程解决方案 Baseimage-docker,胖容器和“容器也是虚拟机”
- 基于Pytorch再次解读ResNet现代卷积神经网络
- 这个程序员如何以一己之力阻止了 Bug 代码的提交并改变整个 DevOps 世界?
- 关于IAR的一些总结 -- ARM调试和Flash调试的区别
- python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...
- z3735f android x86,英特尔的Atom Z3735F分析 全文总结_台电 X80HD_平板电脑评测-中关村在线...
- 采用 J2EE 的公司正在考虑改用 Microsoft .NET ?
- Luhn校验原理与实现【转载】
- JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
- ALSA ASOC
- 图论与代数结构 最短路问题
- java解析json字符串详解(两种方法)
- 爱分析·中国采购数字化行业趋势报告
- 钓鱼比赛(百度笔试)
- 自定义 showToast 组件,可直接使用,附源代码和使用说明
- 如何给PDF文件进行加密?
- idea提示:无法解析 文件 ‘xxx.xml‘,servelet应该有mapping
- 电脑怎么压缩jpg图片?上传jpg图片过大怎么办?
- 自然语言处理工具HanLP-基于层叠HMM地名识别
热门文章
- 浪潮服务器测试文档,ESXI6.7注入浪潮服务器raid驱动测试
- 苹果7手机严重卡顿_为什么苹果手机运存那么小,却不会卡顿?而安卓却不行!长知识了...
- mysql基础表和修理表_MySQL基础知识——创建数据库和表
- springboot的war和jar包
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
- [UE4]解析json数据
- Python学习笔记(四十六)网络编程(2)— UDP编程
- git github的使用
- Struts中Action三种接收参数的方式?
- Windows Phone 修改系统定义的资源颜色