2017.07.24 Python网络爬虫之logging模块
1.Logging模块,顾名思义就是针对日志的,到目前为止,所有的程序标准输出(输出到屏幕)都是使用print函数,Logging模块可以代替print函数的功能,并将标准输出输入到日志文件中保存起来,而且利用logging模块可以部分替代debug的功能,给程序排错
2.logging模块有6个级别:(也可以自定义级别),这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来,发出的信息级别低于定义的级别则忽略,如果未定义级别,默认定义的级别是WARNING
NOTSET值为0
DEBUG值为10
INFO值为20
WARNING值为30
ERROR值为40
CRITICAL值为50
3.使用logging最简单的方法就是logging.basicConfig:logging.basicConfig([**kwargs])
这个函数可用的参数有:
filename:用指定的文件名创建FileHandler,这样的日志会被存储在指定的文件中
filemode:文件打开方式,在指定了filename是使用这个参数,默认值为‘a’还可指定为‘w’
format:指定handler使用的日志显示格式,format参数可能用到的格式化串,如下:
%(name)s:Logger的名字
%(levelno)s:数字形式的日志级别
%(levelname)s:文本形式的日志级别
%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有
%(filename)s:调用日志输出函数的模块的文件名
%(module)s:调用日志输出函数的模块名
%(funcName)s:调用日志输出函数的函数名
%(lineno)d:调用日志输出函数的语句所在的代码行
%(created)f:当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d:输出日志信息时,自Logger创建以来的毫秒数
%(asctime)s:以字符串形式的当前时间,默认格式是"2003-07-08 16:49:45,896",逗号后面是毫秒
%(thread)d:线程ID,可能没有
%(threadName)s:线程名,可能没有
%(process)d:进程ID,可能没有
%(message)s:用户输出的信息
datefmt:指定日期时间的格式,最常用的几个格式化如下:
%Y:年份的长格式,如1999
%y:年份的短格式,如99
%m:月份,01-12
%d:日期,01-31
%H:小时,0-23
%w:星期,0-6,星期天是0
%M:分钟,00-59
%S:秒,00-59
level:设置rootlogger的日志级别
stream:用指定的sream创建StreamHandler,可以指定输出到sys.stderr.,sys.stdout或者文件,默认为sys.stderr,若同时列出了filename和stream两个参数,stream会被忽略
编写一个最基本的日志模块应用程序testLogging.py:
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
class TestLogging(object):
def __init__(self):
logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'
logFileName='./testLog.txt'
logging.basicConfig(level=logging.INFO,format=logFormat,filename=logFileName,filemode='w')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
if __name__ == '__main__':
tl=TestLogging()
刚开始执行错误,竟然就是因为这话:
logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'
多了一个空格,我去..............
执行结果:
4.编写一个自定义模块myLog:
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
import getpass
import sys
class MyLog(object):
def __init__(self):
"""这个类用于创建一个自用的log"""
user=getpass.getuser()
self.logger=logging.getLogger(user)
self.logger.setLevel(logging.DEBUG)
logFile=sys.argv[0][0:-3]+'.log' #日志文件名
formatter=logging.Formatter('%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s')
"""日志显示到屏幕上并输出到日志文件夹内"""
logHand=logging.FileHandler(logFile)
logHand.setFormatter(formatter)
logHand.setLevel(logging.ERROR) #只有错误才会被记录到logfile中
logHandSt=logging.StreamHandler()
logHandSt.setFormatter(formatter)
self.logger.addHandler(logHand)
self.logger.addHandler(logHandSt)
"""日志的5个级别对应以下的5个函数"""
def debug(self,msg):
self.logger.debug(msg)
def info(self,msg):
self.logger.info(msg)
def warn(self,msg):
self.logger.warn(msg)
def error(self,msg):
self.logger.error(msg)
def critical(self,msg):
self.logger.critical(msg)
if __name__ == '__main__':
mylog=MyLog()
mylog.debug("我是一个debug")
mylog.info("我是一个info")
mylog.warn("我是一个warn")
mylog.error("我是一个error")
mylog.critical("我是一个critical")
执行结果如下:
代码详解:
(1)getpass.getuser():显示当前登录系统用户名;
(2)sys.argv[0][0:-3]+'.log':文件名取程序名的[0:-3],也就是myLog
(3)logging.FileHandler:logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上。class logging.FileHandler(filename, mode='a', encoding=None, delay=False)
(4)logging.StreamHandler():流handler——包含在logging模块中的三个handler之一。
能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)。
只有一个参数:class logging.StreamHandler(stream=None)
5.编写一个testMyLog.py,在程序中导入myLog.py作为模块使用:
# !/usr/bin/env python
# -*- coding:utf-8 -*-
from myLog import MyLog
if __name__ == '__main__':
ml=MyLog()
ml.debug('我是一个 debug message')
ml.info('我是一个 info message')
ml.warn('我是一个 warn message')
ml.error('我是一个 error message')
ml.critical('我是一个 critical message')
执行结果:
学习logging模块参考博客:http://blog.csdn.net/fxjtoday/article/details/6307285