当我们开发一个应用或程序的时候,经常会需要在程序中添加日志功能,以便排查潜在的问题或者调试代码。Python提供了内置的logging模块,可以在Python程序中很方便地实现日志功能。log函数是在logging模块中最关键的函数之一,接下来我将详细讲解Python中的log函数,以及如何在程序中进行日志处理。
1. log函数的基本用法
Python中的log函数可以在程序中输出不同程度的日志信息,主要有以下五个级别:
- CRITICAL(50):表示严重错误,程序可能无法继续执行。
- ERROR(40):表示程序发生了错误,但仍然可以继续运行。
- WARNING(30):表示警告信息,程序可以继续执行。
- INFO(20):表示程序正常运行,可以输出一些提示信息。
- DEBUG(10):表示程序调试信息,输出较为详细的程序运行信息。
下面是log函数的基本用法:
import logging
# 设置日志信息输出的格式
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG)
# 输出不同级别的日志信息
logging.debug('This is a debug message.')
logging.info('This is an info message.')
logging.warning('This is a warning message.')
logging.error('This is an error message.')
logging.critical('This is a critical message.')
运行上述代码,会依次输出5种不同的日志级别信息,其输出结果如下:
2021-05-13 09:30:28,197 DEBUG This is a debug message.
2021-05-13 09:30:28,197 INFO This is an info message.
2021-05-13 09:30:28,197 WARNING This is a warning message.
2021-05-13 09:30:28,197 ERROR This is an error message.
2021-05-13 09:30:28,197 CRITICAL This is a critical message.
输出的信息中,按照时间、日志级别以及日志信息的格式展示,方便对程序运行过程中的问题进行调试和分析。
2. 日志的配置和输出位置控制
在实际应用中,我们需要对日志的格式和输出位置进行配置控制。例如,我们可以将日志信息输出到文件或者控制台,也可以采取定期轮询或者性能优化等方式,提高日志处理的效率。下面是一个基于配置文件的log函数示例:
import logging.config
# 加载日志处理的配置文件
logging.config.fileConfig('logging.conf')
# 输出不同级别的日志信息
logging.debug('This is a debug message.')
logging.info('This is an info message.')
logging.warning('This is a warning message.')
logging.error('This is an error message.')
logging.critical('This is a critical message.')
上述代码中,我们通过logging.config
模块的fileConfig()
函数加载了一个配置文件logging.conf
,该文件用于配置日志信息的格式和输出位置。下面是一个logging.conf
的示例:
[loggers]
keys=root,sampleLogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=sampleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_sampleLogger]
level=DEBUG
handlers=consoleHandler
qualname=sampleLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=sampleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=sampleFormatter
args=('log/sample-app.log', 'a', 1000000, 5)
[formatter_sampleFormatter]
format=%(asctime)s %(name)s %(levelname)s: %(message)s
datefmt=%Y-%m-%d %H:%M:%S
该配置文件中,我们首先定义了loggers
、handlers
和formatters
三个模块,用于配置不同级别的日志信息、日志输出的方式以及日志信息的格式。在日志处理的配置中,我们需要配置两个基本的属性:level
和handlers
。其中,level
指定日志信息的级别,例如上述示例中的level=DEBUG
表示输出所有日志信息;handlers
指定日志输出到哪些位置,例如上述示例中的handlers=consoleHandler,fileHandler
表示将日志信息同时输出到控制台和文件中。
3. 示例代码:使用logging处理爬虫错误
以上是log函数的基本用法以及日志配置和输出位置的控制方法,下面我们将通过一个具体的例子,介绍如何使用logging处理爬虫中的错误信息。
在爬取网络数据时,难免会遇到网络请求超时、页面不存在、读取数据失败等错误情况,这些错误信息对于我们及时排查问题非常关键。下面是一个简单的爬虫示例:
import logging
import requests
# 配置日志信息
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG)
# 请求网页内容
def request_web_page(url):
try:
r = requests.get(url, timeout=1)
except requests.exceptions.RequestsException as e:
logging.error('Request Error: %s' % e)
return None
if r.status_code == 200:
return r.content
else:
logging.warning('Web Page Not Found: %s' % url)
return None
# 测试爬虫程序
if __name__ == '__main__':
url = 'http://www.baidu.com'
content = request_web_page(url)
if content:
logging.info('Web Page Success: %s' % url)
else:
logging.critical('Web Page Failed: %s' % url)
在上面的示例中,我们首先通过logging.basicConfig()
函数配置了日志信息的格式和级别,然后定义了一个用于请求网页内容的request_web_page()
函数,该函数通过requests模块实现对指定URL的请求,并根据响应的状态码返回对应的内容。在处理请求错误和不存在的页面时,我们通过logging模块的相关函数输出相应的日志信息,在调试和排错时非常有用。
运行上述爬虫示例,输出结果如下:
2021-05-13 09:41:56,389 INFO Web Page Success: http://www.baidu.com
从输出结果中,我们可以看到程序正常运行,并输出了请求成功的日志信息,从而方便我们及时调试程序。