优雅地记录Python程序日志1:logging模块简介
本文摘自:https://zhuanlan.zhihu.com/p/31893724
本篇涉及:
- logging模块的调用;
- 保存log日志为文件;
- 调整输入日志等级;
- 修改日志消息格式;
前言
在使用Python编写程序的过程中,我们经常使用print()函数打印一些信息到控制台,方便的查看结果和一些调试信息,以判断程序的运行是否正常。
print()确实是方便和易用,但是也有一些缺点,比如打印出来的信息不能保存,再次运行程序时,之前打印出来的结果就被清空了。
而对于一些后台运行的程序,或者出现的异常,比如Web应用,直接将信息使用print()打印出来,显然不利于程序出现故障之后的排错和调试。
这个时候,一个程序日志记录器就显得很有必要了。
日志器用于跟踪记录程序运行时发生的一些事件,一般而言,一条日志记录由事件的描述性信息、可选的可变数据组成。
Python的内置日志模块
Python中内置一个日志模块——logging,通过它我们就可以很方便的在Python代码中记录简单的程序日志。
logging模块将日志分为了五个等级:
- DEBUG:调试信息,通常在诊断问题的时候用得着;
- INFO:普通信息,确认程序安装预期运行;
- WARNING:警告信息,表示发生了意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行;
- ERROR:错误信息,程序运行中出现了一些问题,一些功能没有执行;
- CRITICAL:危险信息,一个严重的错误,导致程序无法继续运行。
上述的五个等级的日志信息分别使用:logging模块的debug()、info()、warning()、error()、critical()方法来实现。
默认情况下,logging使用的日志级别是warning,这表示只有在这个级别及其以上级别的日志信息才会被记录,所以默认情况下debug信息和info信息都不会被显示出来。
我们来测试一下:
import logging
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
运行代码,控制台会显示:
ERROR:root:出现了错误
WARNING:root:警告信息
INFO级别的信息,果然没有显示出来。
我们使用logging模块的basicConfig()方法,修改一个日志输出等级为INFO :
import logging
logging.basicConfig(level=logging.INFO)
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
这样,控制台中就能够输出INFO级别的信息了:
ERROR:root:出现了错误
INFO:root:打印信息
WARNING:root:警告信息
记录的日志信息除了打印到控制台之外,我们还能够将其写入文件中。同样是使用basicConfig()方法进行设置:
import logging
logging.basicConfig(level=logging.INFO,filename='test.log')
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
运行程序,会生成一个名为test.log的文本文件,里面是日志记录的内容:
如果我们重复运行上面的代码,会发现,日志信息会追加在test.log文件的内容后面:
如果不想这样怎么办,同样在basicConfig()方法中使用filemode参数进行设置:
import logging
logging.basicConfig(level=logging.INFO,filename='test.log',filemode='w')
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
这样,生成的日志文件就是一个新的:
在上面输出的日志信息我们可以发现,所有的消息都是"日志级别:角色:消息"这样的格式输出的。
如果我们想改变日志消息的格式呢?同样使用basicConfig()方法,利用其format参数进行设置。先来看一个例子:
import logging
logging.basicConfig(level=logging.INFO,filename='test.log',format="%(levelname)s:%(message)s")
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
我们设置格式为消息等级和消息内容。输出的日志内容中,已经没有了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:创建日志记录的时间(以毫秒为单位)
借助于这些格式,我们可以自定义日志记录,比如显示时间:
import logging
logging.basicConfig(level=logging.INFO,filename='test.log',format="%(levelname)s:%(asctime)s:%(message)s")
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
这样,日志中除了记录消息等级、消息信息外,还会记录上消息创建的时间:
对于logging模块,还有更加深入的用法,我们下一篇继续。
优雅地记录Python程序日志1:logging模块简介的更多相关文章
- 优雅地记录Python程序日志2:模块组件化日志记录器
本文摘自:https://zhuanlan.zhihu.com/p/32043593 本篇将会涉及: logging的各个模块化组件 构建一个组件化的日志器 logging的模块组件化 在上一篇文章中 ...
- 使用配置文件方式记录Python程序日志
开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...
- Python之日志处理 logging模块
Python之日志处理(logging模块) 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...
- Python日志输出——logging模块
Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...
- 【Python】 日志管理logging
logging *****本文参考了http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html ■ 最最基本的用法 logging模块用 ...
- 如何优雅地退出python程序
如何优雅地退出python程序 一个单模的python程序,启动之后要能够优雅地关闭.即当用户按Ctrl+C或者kill pid的时候,程序都能从容关闭.实现起来非常简单. is_running = ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- Python logging 模块简介
Table of Contents 1. Logging 模块 1.1. 简介 1.2. 简单输出日志 1.3. 输入日志到文件 1.4. 几个基本概念 1.4.1. loggers 1.4.2. h ...
- Python进阶(十一)----包,logging模块
Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文 ...
随机推荐
- ionic + angular + cordova, 打造专属自己的App!
ionic 学习地址:http://ionicframework.com/ ionic 好处: ionic serve --lab 预览平台间的差异化 sass 提 ...
- Differences Between Enterprise, Standard and Standard One Editions on Oracle 11.2 (Doc ID 1084132.1)
标准版不允许并行.分区.闪回.各种缓存等大数据量必须特性,如此限制,oracle摆明了只卖企业版,买标准版不如mysql(如果不熟悉postgresql的话). Oracle企业版1 CPU 20w起 ...
- forever 用法
安装过Node.js后再安装forever,需要加-g参数,因为forever要求安装到全局环境下: npm install forever -g 常用指令: npm install forever ...
- WIN10安装和使用MySql5.6中遇到的一些问题与解决
WIN10安装和使用MySql5.6中遇到的一些问题与解决 提示一下,安装前需要安装python环境. MySql安装缺少组件MySQL for Excel 如图(转载别人的图,自己的安装时没有截图) ...
- spring启动后立即执行方法
1.方法所属的类继承InitializingBean接口. 2.重写afterPropertiesSet()方法. afterPropertiesSet方法会在bean被初始化时执行. 当bean的作 ...
- 修改button样式小例子
.toolbar button{ background: none; border:none; padding:0 3px;} <div class="toolbar toolbar- ...
- Flask学习【第4篇】:用Flask的扩展实现的简单的页面登录
from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...
- luogu P5105 不强制在线的动态快速排序
前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们不动脑子的打表容易发现 连续区间[ ...
- FileAttributes Enum
https://docs.microsoft.com/en-us/dotnet/api/system.io.fileattributes?view=netframework-4.7.2 读取FileA ...
- Logstash Introduction
https://www.cnblogs.com/aresxin/p/8035137.html Elasticsearch是个开源分布式搜索引擎,提供搜集.分析.存储数据三大功能.它的特点有:分布式,零 ...