400-616-5551

您所在位置: 首页> 学习课程> python培训 | Python 爬虫:logging模块

python培训 | Python 爬虫:logging模块

发布百知教育 来源:学习课程 2019-10-11

logging模块,顾名思义就是针对日志的。到目前为止,所有的程序标准输出(输出到屏幕)都是使用的print函数。logging模块可以替代print函数的功能,并能将标准输出输入到日志文件保存起来,而且利用logging模块可以部分替代debug的功能,给程序排错。


1、简述logging模块


首先要说到的是logging模块的几个级别。默认情况下logging模块有6个级别。它们分别是NOTSET值为0、DEBUG值为10、INFO值为20、WARNING值为30、ERROR值为40、CRITICAL值为50(也可以自定义级别)。这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来。发出的信息级别低于定义的级别则略过。如果未定义级别,默认定义的级别是WARNING。


先测试一下。在Windows中打开IDLE,执行命令:


import logging

logging.NOTSET

logging.DEBUG

logging.INFO

logging.WARNING

logging.ERROR

logging.CRITICAL

logging.debug("debug message")

logging.info("info message")

logging.warning("warning message")

logging.error("error message")

logging.critical("critical message")


执行结果如图1所示。


python培训


图1  logging级别

使用logging最简单的方法就是logging.basicConfig。logging.basicConfig的应用方法为:


logging.basicConfig([**kwargs])

这个函数可用的参数有:


filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。


filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。


format:指定handler使用的日志显示格式。


datefmt:指定日期时间格式。


level:设置rootlogger的日志级别。


stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

参数中的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:字符串形式的当前时间。默认格式是“2019-08-09 10:49:45,896”。逗号后面的是毫秒。
%(thread)d:线程ID。可能没有。
%(threadName)s:线程名。可能没有。
%(process)d:进程ID。可能没有。
%(message)s:用户输出的消息。

参数中的datefmt是日期的格式化,最常用的几个格式化是:


%Y:年份的长格式,如2019。

%y:年份的短格式,如99。

%m:月份,01~12。

%d:日期,01~31。

%H:小时,0~23。
%w:星期,0~6,星期天是0。
%M:分钟,00~59。
%S:秒,00~59。

下面利用logging.basicConfig写一个最基本的日志模块应用程序,编写testLogging.py,打开Putty连接到Linux,执行命令:


cd code/crawler
vi testLogging.py


testLogging.py的代码如下:

1    #!/usr/bin/env python3

2    #-*- coding: utf-8 -*-

3    __author__ = 'hstking hst_king@hotmail.com'

4

5    import logging

6

7    class TestLogging(object):

8     def __init__(self):

9         logFormat='%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s'

10         logFileName = './testLog.txt'

11

12         logging.basicConfig(level = logging.INFO,

13    format = logFormat,

14    filename = logFileName,

15    filemode = 'w')

16

17         logging.debug('debug message')

18         logging.info('info message')

19         logging.warning('warning message')

20         logging.error('error message')

21         logging.critical('critical message')

22

23

24     if __name__ == '__main__':

25     tl = TestLogging()

按Esc键,进入命令模式后输入:wq,保存testLogging.py。testlogging.py用于测试logging模块。该脚本使用不同的级别向logger发送了几条信息。执行命令:


python3 testLogging.py
cat testLog.txt

得到的结果如图2所示。


python培训



图2  运行testLogging.py

默认的logging级别是logging.INFO(程序第12行),而logging.debug(程序第17行)的级别低于logging.INFO,所以没有显示。


在程序中的关键位置插入log信息,执行Python程序时出现什么问题,可以直接查找日志文件,无须再一步步地debug调试。

2、自定义模块myLog

使用logging模块很方便,但在编写过程中添加一大堆的代码就不是那么愉快的事情了。好在Python有强大的import,完全可以先配置好一个myLog.py,以后需要使用时直接导入程序中即可。


编写myLog.py。打开Putty连接到Linux,执行命令:

cd code/crawler
vi myLog.py

myLog.py的代码如下:

1    #!/usr/bin/env python3

2    # -*- coding:utf-8 -*-

3    __author__ = 'hstking hst_king@hotmail.com'

4

5    import logging

6    import getpass

7    import sys

8

9

10    # 定义MyLog类

11    class MyLog(object):

12     '''这个类用于创建一个自用的log '''

13     def __init__(self): #类MyLog的构造函数

14         user = getpass.getuser()

15         self.logger = logging.getLogger(user)

16         self.logger.setLevel(logging.DEBUG)

17         logFile = './' + sys.argv[0][0:-3] + '.log' #日志文件名

18         formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s%(name)-10s %(message)-12s')

19

20         '''日志显示到屏幕上并输出到日志文件内'''

21         logHand = logging.FileHandler(logFile)

22         logHand.setFormatter(formatter)

23         logHand.setLevel(logging.ERROR) #只有错误才会被记录到logfile中

24

25         logHandSt = logging.StreamHandler()

26         logHandSt.setFormatter(formatter)

27

28         self.logger.addHandler(logHand)

29         self.logger.addHandler(logHandSt)

30

31     ''' 日志的5个级别对应以下的5个函数 '''

32     def debug(self,msg):

33         self.logger.debug(msg)

34

35     def info(self,msg):

36         self.logger.info(msg)

37

38     def warn(self,msg):

39         self.logger.warn(msg)

40

41     def error(self,msg):

42         self.logger.error(msg)

43

44     def critical(self,msg):

45         self.logger.critical(msg)

46

47     if __name__ == '__main__':

48     mylog = MyLog()

49     mylog.debug("I'm debug")

50     mylog.info("I'm info")

51     mylog.warn("I'm warn")

52     mylog.error("I'm error")

53     mylog.critical("I'm critical")


按Esc键,进入命令模式后输入:wq,保存myLog.py。myLog.py可以当成一个脚本执行,也可以当成一个模块导入其他的脚本中执行。在这里是作为脚本使用的,它的作用是将所有的log信息显示到屏幕上、错误信息存入log文档中。执行命令:


python3 myLog.py
cat myLog.log

得到的结果如图3所示。


python培训


图3  运行myLog.py

下面再写一个testMyLog.py,在程序中导入图3中的myLog.py作为模块使用。编写testMyLog.py,打开Putty连接到Linux,执行命令:


cd code/crawler
vi testMyLog.py

testMyLog.py的代码如下:

1    #!/usr/bin/env python3

2    #-*- coding: utf-8 -*-

3    __author__ = 'hst_king hst_king@hotmail.com'

4

5    from myLog import MyLog

6

7    if __name__ == '__main__':

8     ml = MyLog()

9     ml.debug('I am debug message')

10     ml.info('I am info message')

11     ml.warn('I am warn message')

12     ml.error('I am error message')

13     ml.critical('I am critical message')


按Esc键,进入命令模式后输入:wq,保存testMyLog.py。testMyLog.py调用了myLog.py,将它作为模块使用。执行命令:


python3 testMyLog.py
cat testMyLog.log

得到的结果如图4所示。



python培训


图4  导入自定义模块

在编程时,有时为了查看程序的进度和参数的变化,在程序中间插入了大量的print。检查完毕后又要逐个删除,费时费力。使用log后就简单多了,调试信息直接保存为日志文件即可。


python培训:http://www.baizhiedu.com/python2019





上一篇:python培训 | 怎么入门Python?掌握python爬虫?

下一篇:应届生去公司找个Java程序员的职位需要什么技能?

相关推荐

www.baizhiedu.com

有位老师想和您聊一聊

关闭

立即申请