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

 

posted @ 2017-07-25 09:48  小春熙子  阅读(911)  评论(0编辑  收藏  举报