本文摘自: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:模块组件化日志记录器相关推荐

  1. python代码执行过程记录_优雅的记录Python程序日志

    1 本篇概要 logging模块的调用: 保存log日志为文件: 调整输入日志等级: 修改日志消息格式: 2 前言 在使用Python编写程序的过程中,我们经常使用print()函数打印一些信息到控制 ...

  2. 如何优雅地退出python程序

    如何优雅地退出python程序 一个单模的Python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. [python] view ...

  3. python程序员的工作内容_每个Python程序员都要知道的日志实践

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cp ...

  4. python程序调试logging_python-logging模块的简单使用

    本人是新手程序员,写文章是为了记录学习,文章中多有错误,还望大家谅解,并指出问题. 本文用到的技术与工具:python,pycharm,logging等. 最近写了一个程序demo,一天24小时挂着跑 ...

  5. python利用什么写模板_利用python自动生成verilog模块例化模板

    一.前言 初入职场,一直忙着熟悉工作,就没什么时间更新博客.今天受"利奇马"的影响,只好宅在家中,写写技术文章.芯片设计规模日益庞大,编写脚本成了芯片开发人员必要的软技能.模块端口 ...

  6. 微信小程序 基础3【组件化开发、自定义组件、全栈开发、使用Express】

    视频地址: https://www.bilibili.com/video/BV1cW411T7t6  [2018]学做小程序- 清华大学 https://www.bilibili.com/video/ ...

  7. 58 同城 iOS 客户端搜索模块组件化实践

    [编者按]58 同城 App 自从 1.0 版本开始,便已经提供了搜索功能.随着版本的迭代.业务的复杂,搜索框架也在不断受到挑战.诸如代码不能复用.耦合度高.业务功能接入成本高等问题日积月累,成为需要 ...

  8. python中自定义模块导入飘红_hadoop streaming 中跑python程序,自定义模块的导入

    今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题:不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件 ...

  9. [填坑手册]小程序目录结构和组件化使用心得

    小程序目录结构 关于小程序的目录结构,可以说一开始大家都有各自的开发习惯和命名规则,但一旦项目变得复杂庞大的时候,你就发现管理起来和后期维护变得很麻烦,如果是 协同开发 的话,更容易出现 " ...

最新文章

  1. 学习AI方向大半年,为什么你还没有别人几个月更精通?
  2. docker 僵尸进程解决方案 Baseimage-docker,胖容器和“容器也是虚拟机”
  3. 基于Pytorch再次解读ResNet现代卷积神经网络
  4. 这个程序员如何以一己之力阻止了 Bug 代码的提交并改变整个 DevOps 世界?
  5. 关于IAR的一些总结 -- ARM调试和Flash调试的区别
  6. python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...
  7. z3735f android x86,英特尔的Atom Z3735F分析 全文总结_台电 X80HD_平板电脑评测-中关村在线...
  8. 采用 J2EE 的公司正在考虑改用 Microsoft .NET ?
  9. Luhn校验原理与实现【转载】
  10. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
  11. ALSA ASOC
  12. 图论与代数结构 最短路问题
  13. java解析json字符串详解(两种方法)
  14. 爱分析·中国采购数字化行业趋势报告
  15. 钓鱼比赛(百度笔试)
  16. 自定义 showToast 组件,可直接使用,附源代码和使用说明
  17. 如何给PDF文件进行加密?
  18. idea提示:无法解析 文件 ‘xxx.xml‘,servelet应该有mapping
  19. 电脑怎么压缩jpg图片?上传jpg图片过大怎么办?
  20. 自然语言处理工具HanLP-基于层叠HMM地名识别

热门文章

  1. 浪潮服务器测试文档,ESXI6.7注入浪潮服务器raid驱动测试
  2. 苹果7手机严重卡顿_为什么苹果手机运存那么小,却不会卡顿?而安卓却不行!长知识了...
  3. mysql基础表和修理表_MySQL基础知识——创建数据库和表
  4. springboot的war和jar包
  5. 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
  6. [UE4]解析json数据
  7. Python学习笔记(四十六)网络编程(2)— UDP编程
  8. git github的使用
  9. Struts中Action三种接收参数的方式?
  10. Windows Phone 修改系统定义的资源颜色