python的log函数详解

  • Post category:Python

当我们开发一个应用或程序的时候,经常会需要在程序中添加日志功能,以便排查潜在的问题或者调试代码。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

该配置文件中,我们首先定义了loggershandlersformatters三个模块,用于配置不同级别的日志信息、日志输出的方式以及日志信息的格式。在日志处理的配置中,我们需要配置两个基本的属性:levelhandlers。其中,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

从输出结果中,我们可以看到程序正常运行,并输出了请求成功的日志信息,从而方便我们及时调试程序。