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 相关文章推荐
以一段代码为实例快速入门Python2.7
Mar 31 Python
python文件写入实例分析
Apr 08 Python
处理Python中的URLError异常的方法
Apr 30 Python
python利用拉链法实现字典方法示例
Mar 25 Python
Python向日志输出中添加上下文信息
May 24 Python
python去除字符串中的换行符
Oct 11 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
关于python3中setup.py小概念解析
Aug 22 Python
Django实现图片上传功能步骤解析
Apr 22 Python
Python Django模型详解
Oct 05 Python
python脚本框架webpy模板赋值实现
Nov 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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP中cookie知识点学习
2018/05/06 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
javascript基础知识
2016/06/07 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
python如何让类支持比较运算
2018/03/20 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
python在地图上画比例的实例详解
2020/11/13 Python
Python request post上传文件常见要点
2020/11/20 Python
2019年c语言经典面试题目
2016/08/17 面试题
小学生新学期寄语
2014/01/19 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python