python标准日志模块logging的使用方法


Posted in Python onNovember 01, 2013

最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下。
python的标准库里的日志系统从Python2.3开始支持。只要import logging这个模块即可使用。如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用:

import logging
# 创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
logger.info('foorbar')

结合上面的例子,我们说下几个最常使用的API:

logging.getLogger([name])

返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。

Logger.setLevel(lvl)

设置logger的level, level有以下几个级别:

级别高低顺序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出

logger.debug("foobar")    # 不输出   
logger.info("foobar")        # 输出  
logger.warning("foobar")  # 输出  
logger.error("foobar")      # 输出  
logger.critical("foobar")    # 输出 

Logger.addHandler(hdlr)
通过handler对象可以把日志内容写到不同的地方。比如简单的StreamHandler就是把日志写到类似文件的地方。python提供了十几种实用handler,比较常用有:
StreamHandler: 输出到控制台
 FileHandler:   输出到文件
BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
SocketHandler 用TCP网络连接写LOG
DatagramHandler 用UDP网络连接写LOG
SMTPHandler 把LOG写成EMAIL邮寄出去

logging.basicConfig([**kwargs])* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,设置默认的格式。* 这些函数: logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果调用的时候发现root logger没有任何handler,会自动调用basicConfig添加一个handler* 如果root logger已有handler,这个函数不做任何事情使用basicConfig来配置root logger的输出格式和level:
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')

ogger对象直接提供日志接口。formatter描述日志的格式。handler把日志写到不同的地方,你可以把日志保存成本地文件,也可以每个小时写一个日志文件,还可以把日志通过socket传到别的机器上。
从最简单的formatter对象来看。formatter指定的是每一条日志记录的抬头信息,也就是你可以指定日志记录的时间格式、进程号、文件名、函数名等信息。可以用这个方法来创建一个formatter对象:
logging.Formatter.__init__( fmt=None, datefmt=None)

fmt参数指定进程号、文件名、函数名等信息是否出现以及格式, datefmt为日期时间格式,默认的日期格式精确到微秒,例如‘2003-07-08 16:49:45,896'。fmt中可以指定多个字段,每个字段的格式为“%(<dictionary key>)s”, 例如你想打印时间、日志级别、日志信息可以用下面的format:
'%(asctime)s - %(levelname)s - %(message)s'

python标准日志模块logging的使用方法在记录爬虫系统日志的时候需要定义记录日志的级别,级别越高表示打出来的日志越详细。我们可以用一个字典来设置不同级别对应的不同日志信息:
#用字典保存日志级别
format_dict = {
   1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
   5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}

将本文开始的代码封装在一个类中
#开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件   
class Logger():
    def __init__(self, logname, loglevel, logger):
        '''
           指定保存日志的文件路径,日志级别,以及调用文件
           将日志存入到指定的文件中
        '''        # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)
        # 创建一个handler,用于写入日志文件
        fh = logging.FileHandler(logname)
        fh.setLevel(logging.DEBUG)
        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        # 定义handler的输出格式
        #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        formatter = format_dict[int(loglevel)]
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)
    
    def getlog(self):
        return self.logger

再通过以下方式调用,便是一个简单的日志系统了
logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()
Python 相关文章推荐
python抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python实现异步回调机制代码分享
Jan 10 Python
python如何在终端里面显示一张图片
Aug 17 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
python执行精确的小数计算方法
Jan 21 Python
python仿evething的文件搜索器实例代码
May 13 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
Python实现密码薄文件读写操作
Dec 16 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
python类定义的讲解
Nov 01 #Python
用实例说明python的*args和**kwargs用法
Nov 01 #Python
python操作MongoDB基础知识
Nov 01 #Python
python操作MySQL数据库具体方法
Oct 28 #Python
Python sys.path详细介绍
Oct 17 #Python
python开发的小球完全弹性碰撞游戏代码
Oct 15 #Python
python中 ? : 三元表达式的使用介绍
Oct 09 #Python
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
Yii2如何批量添加数据
2016/05/17 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
Python实现图片转字符画的示例
2017/08/22 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
什么是聚集索引和非聚集索引
2012/01/17 面试题
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
自我鉴定写作要点
2014/01/17 职场文书
国家助学金获奖感言
2014/01/31 职场文书
一年级学生评语
2014/04/23 职场文书
文员求职信
2014/07/15 职场文书
办理收楼委托书范本
2014/10/09 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL