优雅的记录Python程序日志

1

本篇概要

  • logging模块的调用;
  • 保存log日志为文件;
  • 调整输入日志等级;
  • 修改日志消息格式;

2

前言

在使用Python编写程序的过程中,我们经常使用print()函数打印一些信息到控制台,方便的查看结果和一些调试信息,以判断程序的运行是否正常。

print()确实是方便和易用,但是也有一些缺点,比如打印出来的信息不能保存,再次运行程序时,之前打印出来的结果就被清空了。

而对于一些后台运行的程序,或者出现的异常,比如Web应用,直接将信息使用print()打印出来,显然不利于程序出现故障之后的排错和调试。

这个时候,一个程序日志记录器就显得很有必要了。

日志器用于跟踪记录程序运行时发生的一些事件,一般而言,一条日志记录由事件的描述性信息、可选的可变数据组成。

3

Python的内置日志模块

Python中内置一个日志模块——logging,通过它我们就可以很方便的在Python代码中记录简单的程序日志。

logging模块将日志分为了五个等级:

  • DEBUG:调试信息,通常在诊断问题的时候用得着;
  • INFO:普通信息,确认程序安装预期运行;
  • WARNING:警告信息,表示发生了意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行;
  • ERROR:错误信息,程序运行中出现了一些问题,一些功能没有执行;
  • CRITICAL:危险信息,一个严重的错误,导致程序无法继续运行。

上述的五个等级的日志信息分别使用:logging模块的debug()、info()、warning()、error()、critical()方法来实现。

默认情况下,logging使用的日志级别是warning,这表示只有在这个级别及其以上级别的日志信息才会被记录,所以默认情况下debug信息和info信息都不会被显示出来。

我们来测试一下:

运行代码,控制台会显示:

ERROR:root:出现了错误
WARNING:root:警告信息

INFO级别的信息,果然没有显示出来。

我们使用logging模块的basicConfig()方法,修改一个日志输出等级为INFO :

这样,控制台中就能够输出INFO级别的信息了:

ERROR:root:出现了错误
INFO:root:打印信息
WARNING:root:警告信息

记录的日志信息除了打印到控制台之外,我们还能够将其写入文件中。同样是使用basicConfig()方法进行设置:

运行程序,会生成一个名为test.log的文本文件,里面是日志记录的内容:

如果我们重复运行上面的代码,会发现,日志信息会追加在test.log文件的内容后面:

如果不想这样怎么办,同样在basicConfig()方法中使用filemode参数进行设置:

这样,生成的日志文件就是一个新的:

在上面输出的日志信息我们可以发现,所有的消息都是"日志级别:角色:消息"这样的格式输出的。

如果我们想改变日志消息的格式呢?同样使用basicConfig()方法,利用其format参数进行设置。先来看一个例子:

我们设置格式为消息等级和消息内容。输出的日志内容中,已经没有了root这个信息了:

logging支持的格式还不止这两种,我们来看看:

  • %(asctime)s:日志创建时的普通时间;
  • %(created)f:日志创建时的时间(由time.time()返回);
  • %(filename)s:文件名;
  • %(funcName)s:调用日志记录的函数;
  • %(levelname)s:日志消息的文本级别;
  • %(levelno)s:日志消息的数字级别;
  • %(lineno)d:调用日志消息的行号;
  • %(msecs)d:创建时间的毫秒部分;
  • %(message)s:日志消息;
  • %(name)s:日志器的名称;
  • %(pathname)s:记录日志的源文件的路径名;
  • %(process)d:进程ID;
  • %(processName)s:进程名;
  • %(thread)d:线程ID;
  • %(threadName)s:线程名;
  • %(relativeCreated)d:创建日志记录的时间(以毫秒为单位)

借助于这些格式,我们可以自定义日志记录,比如显示时间:

这样,日志中除了记录消息等级、消息信息外,还会记录上消息创建的时间:

对于logging模块,还有更加深入的用法,我们下一篇继续。

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术

使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

  最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志...

634
来自专栏java相关

Redis学习笔记01---配置文件

1154
来自专栏平凡文摘

Tomcat 的 Server 文件配置详解!

1404
来自专栏Java 源码分析

Redis基本入门

1.Redis简介     Redis 是一种基于内存亦可持久化的日志型,Key-Value 数据库。可持久在于他的部分数据是存放在内存上,而当数据库重启以后他...

34710
来自专栏java技术学习之道

详解Tomcat 配置文件server.xml

1332
来自专栏博客园

Redis事务

和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULIT,EXEC,DISCARD,WATCH这个四个命令是实现事务的基...

962
来自专栏散尽浮华

nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。 废话不多说,下面对测试环境下的nginx反向代理+缓存...

3939
来自专栏惨绿少年

Linux分区规划与xshell使用排错

1.1 没有重要数据 /boot   200M    存放系统的引导信息 内核 swap   交换分区 防止内存用光了 临时的一个内存 如果...

2180
来自专栏你不就像风一样

[转]Tomcat 的 Server 文件配置详解!

转自:https://blog.csdn.net/Y0Q2T57s/article/details/81187444 

1041
来自专栏blackheart的专栏

[OIDC in Action] 1. 基于OIDC(OpenID Connect)的SSO

在[认证授权]系列博客中,分别对OAuth2和OIDC在理论概念方面进行了解释说明,其间虽然我有写过一个完整的示例(https://github.com/lin...

27310

扫码关注云+社区