Python日志模块学习,从这里开始...

举报
技术火炬手 发表于 2019/09/02 14:34:28 2019/09/02
【摘要】 一脸懵逼一直比较喜欢在简书上写博文,主要是因为它的页面看着清爽,没有csdn那么多的广告。可周五写文章的时候就看到禁止发文章的提示,当时以为是系统维护没有注意,没想到今天看到置顶文章才知道,要整改一个月。之前文章就吐槽过,不知道从何时开始,简书首页上每天充斥着大量的擦边小黄文,反而技术类的文章没几篇能上榜的。对于这种问题,很多人都在吐槽、投诉文章,但没什么卵用。这下好了封停一个月,好好整改下...

一脸懵逼

image.png

一直比较喜欢在简书上写博文,主要是因为它的页面看着清爽,没有csdn那么多的广告。可周五写文章的时候就看到禁止发文章的提示,当时以为是系统维护没有注意,没想到今天看到置顶文章才知道,要整改一个月。

之前文章就吐槽过,不知道从何时开始,简书首页上每天充斥着大量的擦边小黄文,反而技术类的文章没几篇能上榜的。对于这种问题,很多人都在吐槽、投诉文章,但没什么卵用。这下好了封停一个月,好好整改下吧。期待一个月后能看到一个不一样的简书平台,那么最近,只能在csdn上发文章了。之前的csdn账号id有些晦涩,虽然用了几年了,但决定还是重开了一个博客,期待大家的关注,博客地址:

csdn博客地址:https://blog.csdn.net/BreezePython

由于新开的博客,历史的文章还没有迁移,抽空慢慢迁移过来吧…

消息与记录

刚才谈到了关于历史账号的文章与消息记录,所以今天想跟大家聊聊Python关于消息记录的模块:日志管理模块 logging。

学习python的第一课,肯定都是print('Hello Wrold...')。但print仅仅使用于我们日常学习,当我们的程序需要部署上线时,程序必须要具备记录日志与程序输出的功能。此时print就不能满足我们的需求,而logging应运而生。

logging是python的内置模块,无需安装即可直接使用。logging模块借鉴了Apache的Log4j中很多的功能与特性,使用起来较为方便,不论你是最简单无脑输出还是定义自己的过滤器与格式,最终都能满足大家的需求,所以logging模块是你的必修课!

Logging入门

日志级别

image.png

那么logging中存在哪些?默认分为六种日志级别(括号为级别对应的数值),NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)。

简单日志打印

说了半天的日志级别,那么这东西对日志记录有什么用?此时我们需要了解LogLevel。logging模块默认记录日志的级别是大于等于WARNING。那么让我们来看第一个例子:

image.png

理想中我们期望的打印结果是从debug到critical,但现实是日志从warning级别开始打印。而且这种日志的打印和print又有什么区别,我们需要丰满日志的内容,提升逼格。

配置日志输出

logging提供了basicConfig函数,用于对日志输入进行相关配置。

让我们来看看basicConfig有哪些可配置参数吧:

filename: 指定日志文件名

filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’

format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

%(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: 打印日志信息

datefmt: 指定时间格式,同time.strftime()

level: 设置日志级别,默认为logging.WARNING

stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,

    默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

image.png

通过配置basicConfig,日志输出看起来就工整多了…当看到第一个filename的时候就想到了,现在的日志都是在控制台输出的,我们添加该参数后,就可以将日志输出到文本了,对吧?答案是肯定的,如下图:

image.png

但此时出现一个问题,我们的日志都保存到了文本中,前台的控制栏不再具备日志输出功能了!

Logging进阶

刚才提到的入门使用,只是针对logging的一个简单操作,如果我们想深入的去使用logging模块,就必须了解Logger,Handler,Formatter,Filter的概念:

  • Logger提供了应用程序可以直接使用的接口;

  • Handler将(logger创建的)日志记录发送到合适的目的输出;

  • Filters提供了细度设备来决定输出哪条日志记录;

  • Formatter决定日志记录的最终输出格式。

Logger

Logger 对象要做三件事情。首先,它们向应用代码暴露了许多方法,这样应用可以在运行时记录消息。其次,记录器对象通过严重程度(默认的过滤设施)或者过滤器对象来决定哪些日志消息需要记录下来。第三,记录器对象将相关的日志消息传递给所有感兴趣的日志处理器。

常用的记录器对象的方法分为两类:配置和发送消息。

这些是最常用的配置方法:

Logger.setLevel()指定logger将会处理的最低的安全等级日志信息, debug是最低的内置安全等级,critical是最高的内建安全等级。例如,如果严重程度为INFO,记录器将只处理INFO,WARNING,ERROR和CRITICAL消息,DEBUG消息被忽略。

Logger.addHandler()和Logger.removeHandler()从记录器对象中添加和删除处理程序对象。处理器详见Handlers。

Logger.addFilter()和Logger.removeFilter()从记录器对象添加和删除过滤器对象。

Handlers

处理程序对象负责将适当的日志消息(基于日志消息的严重性)分派到处理程序的指定目标。Logger 对象可以通过addHandler()方法增加零个或多个handler对象。举个例子,一个应用可以将所有的日志消息发送至日志文件,所有的错误级别(error)及以上的日志消息发送至标准输出,所有的严重级别(critical)日志消息发送至某个电子邮箱。在这个例子中需要三个独立的处理器,每一个负责将特定级别的消息发送至特定的位置。

其中常用的有4种:

  • logging.StreamHandler -> 控制台输出

  • logging.FileHandler -> 文件输出

  • logging.handlers.RotatingFileHandler

  • logging.handlers.TimedRotatingFileHandler

Formatter

Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

image.png

此时我们就可以实现日志的前后台输出了:

image.png

此时,前后台均输出了相关的日志信息。

Logging特别操作

日志切片

有时候,系统后台的日志会输出的比较频繁,那么我们如何将日志按照大小或者时间进行切片呢?这里就要用到刚才介绍的:

  • logging.handlers.RotatingFileHandler

  • logging.handlers.TimedRotatingFileHandler

每隔 1000 Byte 划分一个日志文件,备份文件为 3 个

file_handler = logging.handlers.RotatingFileHandler("test.log", mode="w", maxBytes=1000, backupCount=3, encoding="utf-8")

每隔 1小时 划分一个日志文件,interval 是时间间隔,备份文件为 10 个

handler2 = logging.handlers.TimedRotatingFileHandler("test.log", when="H", interval=1, backupCount=10)

我们以RotatingFileHandler为例,为了演示方便,我设置文件大小为3kb:

image.png

最终实现:

image.png

关于异常日志

logging模块在对异常获取时,进行了相关的优化操作,来看下这个例子:

image.png

由此可见,当我们在对异常结果进行日志输出时,最好使用logger.exception。

其实logging模块的内容还有很多,比如封装与继承,今天就先介绍到这里,有空了继续为大家补充。

The End

OK,欢迎关注“清风Python”公众号

本文来自“清风Python”

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200