详解Python中的日志模块logging


Posted in Python onJune 19, 2015

许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪。在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cpp,而在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用、且功能强大的日志模块:logging。logging模块支持将日志信息保存到不同的目标域中,如:保存到日志文件中;以邮件的形式发送日志信息;以http get或post的方式提交日志到web服务器;以windows事件的形式记录等等。这些日志保存方式可以组合使用,每种方式可以设置自己的日志级别以及日志格式。日志模块的内容比较多,今天先学习logging模块的基本使用,下次具体学习日志的处理。

先看一个比较简单的例子,让我们对logging模块有个感性的认识:
 

import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
logging.debug('this is a message')

运行上面例子的代码,将会在程序的根目录下创建一个log.txt文件,打开该文件,里面有一条日志记录:”DEBUG:root:this is a message”。
4个主要的组件

  1. logger: 日志类,应用程序往往通过调用它提供的api来记录日志;
  2. handler: 对日志信息处理,可以将日志发送(保存)到不同的目标域中;
  3. filter: 对日志信息进行过滤;
  4. formatter:日志的格式化;

日志级别

在记录日志时, 日志消息都会关联一个级别(“级别”本质上是一个非负整数)。系统默认提供了6个级别,它们分别是:

详解Python中的日志模块logging

可以给日志对象(Logger Instance)设置日志级别,低于该级别的日志消息将会被忽略,也可以给Hanlder设置日志级别,对于低于该级别的日志消息, Handler也会忽略。

logging模块中的常用函数:
logging.basicConfig([**kwargs]):

为日志模块配置基本信息。kwargs 支持如下几个关键字参数:

  • filename :日志文件的保存路径。如果配置了些参数,将自动创建一个FileHandler作为Handler;
  • filemode :日志文件的打开模式。 默认值为'a',表示日志消息以追加的形式添加到日志文件中。如果设为'w', 那么每次程序启动的时候都会创建一个新的日志文件;
  • format :设置日志输出格式;
  • datefmt :定义日期格式;
  • level :设置日志的级别.对低于该级别的日志消息将被忽略;
  • stream :设置特定的流用于初始化StreamHandler;

下面是一个简单的例子:
 

#coding=gbk
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), /
  level = logging.WARN, filemode = 'w', format = '%(asctime)s - %(levelname)s: %(message)s')
logging.debug('debug') 
#被忽略
logging.info('info')  
#被忽略
logging.warning('warn')
logging.error('error')
#----- 结果
#2009-07-13 21:42:15,592 - WARNING: warn
#2009-07-13 21:42:15,640 - ERROR: error
logging.getLogger([name])

创建Logger对象。日志记录的工作主要由Logger对象来完成。在调用getLogger时要提供Logger的名称(注:多次使用相同名称来调用getLogger,返回的是同一个对象的引用。),Logger实例之间有层次关系,这些关系通过Logger名称来体现,如:

p = logging.getLogger(“root”)

c1 = logging.getLogger(“root.c1″)

c2 = logging.getLogger(“root.c2″)

例子中,p是父logger, c1,c2分别是p的子logger。c1, c2将继承p的设置。如果省略了name参数, getLogger将返回日志对象层次关系中的根Logger。
logging.setLoggerClass(klass)
logging.getLoggerClass()

获取/设置日志类型。用户可以自定义日志类来代替系统提供的logging.Logger类。
logging.getLevelName(lvl)

获取日志级别对应的名称。例如:
 

print logging.getLevelName(logging.NOTSET)
print logging.getLevelName(10) 
#logging.DEBUG
print logging.getLevelName(logging.DEBUG)
print logging.getLevelName(30) 
#logging.WARN
print logging.getLevelName(logging.ERROR)
print logging.getLevelName(50) 
#logging.CRITICAL
logging.shutdown()

当不再使用日志系统的时候,调用该方法,它会将日志flush到对应的目标域上。一般在系统退出的时候调用。

Logger对象 通过调用logging.getLogger(name)来创建,它有如下常用的方法和属性:
Logger.setLevel(lvl):

设置日志的级别。对于低于该级别的日志消息将被忽略。下面一个例子演示setLevel方法:
 

#coding=gbk
import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root.test')
log.setLevel(logging.WARN) #日志记录级别为WARNNING
log.info('info')  #不会被记录
log.debug('debug') #不会被记录
log.warning('warnning')
log.error('error')
Logger.debug(msg [ ,*args [, **kwargs]])

记录DEBUG级别的日志信息。参数msg是信息的格式,args与kwargs分别是格式参数。

import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root')
log.debug('%s, %s, %s', *('error', 'debug', 'info'))
log.debug('%(module)s, %(info)s', {'module': 'log', 'info': 'error'})
Logger.info(msg[ , *args[ , **kwargs] ] )
Logger.warnning(msg[ , *args[ , **kwargs] ] )
Logger.error(msg[ , *args[ , **kwargs] ] )
Logger.critical(msg[ , *args[ , **kwargs] ] )

记录相应级别的日志信息。参数的含义与Logger.debug一样。
Logger.log(lvl, msg[ , *args[ , **kwargs] ] )

记录日志,参数lvl用户设置日志信息的级别。参数msg, *args, **kwargs的含义与Logger.debug一样。
Logger.exception(msg[, *args])

以ERROR级别记录日志消息,异常跟踪信息将被自动添加到日志消息里。Logger.exception通过用在异常处理块中,如:
 

import logging
logging.basicConfig(filename = os.path.join(os.getcwd(), 'log.txt'), level = logging.DEBUG)
log = logging.getLogger('root')
try:
  raise Exception, 'this is a exception'
except:
  log.exception('exception') 
#异常信息被自动添加到日志消息中
Logger.addFilter(filt)
Logger.removeFilter(filt)

添加/移除日志消息过滤器。在讲述Filter时具体介绍。
Logger.addHandler(hdlr)
Logger.removeHandler(hdlr)

添加/移除日志消息处理器。在讲述Handler时具体介绍。
Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info[, func, extra])

创建LogRecord对象。日志消息被实例为一个LogRecord对象,并在日志类内处理。

Python 相关文章推荐
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
python爬虫爬取网页表格数据
Mar 07 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python实现简单名片管理系统
Nov 30 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
初学者学习Python好还是Java好
May 26 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
如何在C++中调用Python
May 21 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 #Python
举例详解Python中threading模块的几个常用方法
Jun 18 #Python
Python的time模块中的常用方法整理
Jun 18 #Python
Python抽象类的新写法
Jun 18 #Python
Python实现的彩票机选器实例
Jun 17 #Python
Python基于Tkinter实现的记事本实例
Jun 17 #Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 #Python
You might like
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
公司员工活动策划方案
2014/08/20 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
幽默导游词开场白
2015/05/29 职场文书
酒店员工管理制度
2015/08/05 职场文书
青年教师听课心得体会
2016/01/15 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL