Python异常捕获以及简单错误日志生成

最近,本人在做一个预测项目。我的工作主要是从数据库中提取数据分析、进行数值预测、将预测值存储数据库、程序打包exe等。在实际的exe文件运行过程中可能会因为各种原因导致程序关闭,无法了解错误原因。为了比较直观地了解错误原因,本人在程序中加入了异常捕获模块并自动生成错误日志。

下面,我将用一个例子来实现上述功能的实现。例子主要实现数值相减,如果输入的不是数字,那么程序是会报错的,那么此时应该会在程序路径下生成一个txt格式的错误日志。

话不多说,直接上代码。

import os

if __name__ == '__main__':
    try:
        a = 1
        print('请输入一个数字')
        b = input()
        c = a-int(b)
        print('%d-%d=%d' % (a, int(b), c))
    except Exception as err:
        print("err %s: " % err)
        rootDir = os.path.split(os.path.realpath(__file__))[0]
        blogpath = os.path.join(rootDir, 'test1.txt')
        f = open(blogpath, 'w+')
        f.writelines(repr(err))
        f.close()

代码无需使用任何第三方包,直接使用python常用的异常捕获模块try... except...finally来捕获程序中的异常,然后使用txt文件保存错误信息。

正常运行下,结果如下:

程序错误,会在对应程序路径下自动生成错误日志。结果如下:

错误日志生成效果如下:

此外,这里再介绍一种升级版,代码如下:

import os
import traceback

if __name__ == '__main__':
    try:
        a = 1
        print('请输入一个数字')
        b = input()
        c = a-int(b)
        print('%d-%d=%d' % (a, int(b), c))
    except Exception:
        print(traceback.format_exc())
        rootDir = os.path.split(os.path.realpath(__file__))[0]
        blogpath = os.path.join(rootDir, 'test1.txt')
        f = open(blogpath, 'w+')
        f.writelines(str(traceback.format_exc()))
        f.close()

升级版生成的错误日志如下:

         

从生成日志结果我们可以发现升级版的错误可以定位到具体代码行,而前者只能返回错误类型。大家根据自己需求选择吧。

好了,这就Python异常捕获和简单错误日志生成啦。希望对小伙伴们有帮助。如果有小伙伴对python打包exe感兴趣的,可以私信我。

<think>嗯,用户想了解如何使用Python爬虫来捕获日志或记录相关信息,特别是结合logging模块的实现方法。首先,我需要回想一下Pythonlogging模块的基本用法,以及爬虫开发中常见的日志需求。 首先,用户提到的引用里有几个相关的参考资料。引用[1]详细介绍了Pythonlogging模块,包括日志的捕获、断言和记录。引用[4]和[5]则涉及爬虫技术,特别是动态交互和数据持久化。所以,我需要将这两部分结合起来,说明在爬虫中如何整合日志功能。 接下来,用户的问题可能包括如何在爬虫中配置日志系统,记录不同级别的信息,比如错误、警告,还有如何将日志保存到文件,或者输出到控制台。此外,可能还需要处理异常捕获时的日志记录,比如请求失败时的重试信息,或者解析错误时的详细情况。 我记得logging模块有几个核心组件:Logger、Handler、Formatter、Filter。需要创建一个Logger实例,然后添加不同的Handler,比如FileHandler和StreamHandler,分别用于文件和控制台输出。然后设置Formatter来定义日志的格式,比如时间、级别、消息内容等。 另外,引用[1]中提到日志的重要性,所以需要强调在爬虫中记录关键步骤的必要性,比如发起请求的URL、响应状态码、数据解析结果,以及可能遇到的异常。比如在请求失败时记录错误,或者在解析数据时记录警告,帮助后续调试。 可能还需要考虑日志的级别控制,比如在开发阶段使用DEBUG级别,而在生产环境使用INFO或更高级别。同时,要确保日志文件不会无限增长,可以通过RotatingFileHandler或TimedRotatingFileHandler来实现日志轮换。 用户还可能关心如何在爬虫的不同部分插入日志记录,比如在发送请求前记录URL,收到响应后记录状态码,解析数据时记录成功或失败的信息。此外,异常处理中的日志记录也很重要,比如使用try-except块捕获异常,并记录详细的错误信息,包括堆栈跟踪。 另外,引用[5]提到数据持久化到SQLite,可能需要在日志中记录数据存储的情况,比如插入记录成功或失败,或者数据库连接问题。这时候需要结合数据库操作的日志记录。 还需要注意避免敏感信息泄露,比如在日志中记录请求参数时,如果包含API密钥或密码,应该进行脱敏处理。这时候可能需要配置Filter来过滤掉敏感信息,或者在记录时手动处理。 最后,可能需要提供示例代码,展示如何配置logging模块,并在爬虫的关键步骤中添加日志记录。比如初始化logger,设置处理程序和格式,然后在请求、解析、存储等函数中调用logger.info()、logger.error()等方法。 总结一下,回答应该包括以下几个部分: 1. 引入logging模块,配置日志格式和处理器。 2. 在爬虫的不同阶段记录日志,如请求、响应、解析、存储。 3. 异常处理中的日志记录,包括错误详情。 4. 日志级别的控制和日志文件的轮换。 5. 示例代码展示具体实现。 6. 相关问题的生成,比如如何优化日志、日志分析工具等。 确保代码部分使用正确的格式,比如使用三个反引号包裹Python代码,并遵循用户给的系统级指令,如数学公式的格式,但在这个问题中可能不需要数学公式。同时,引用对应的参考资料,比如引用[1]关于logging模块,引用[4][5]关于爬虫技术。</think>### Python爬虫日志捕获logging实现方法 在Python爬虫开发中,通过`logging`模块记录日志可以帮助监控爬虫运行状态、调试错误并追踪数据流程。以下是结合日志捕获的具体实现方法: --- #### 1. **配置logging模块** 首先初始化日志系统,定义格式、输出位置和日志级别: ```python import logging # 创建Logger实例 logger = logging.getLogger('spider_logger') logger.setLevel(logging.DEBUG) # 设置最低日志级别 # 定义日志格式 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 控制台日志处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 文件日志处理器(自动按大小轮换) file_handler = logging.handlers.RotatingFileHandler( 'spider.log', maxBytes=10*1024*1024, backupCount=5 ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) ``` - **关键点**:通过`RotatingFileHandler`实现日志文件轮换,避免文件过大[^1]。 --- #### 2. **在爬虫关键步骤记录日志** 在请求、解析、存储等环节插入日志记录: ##### **示例:请求与响应记录** ```python import requests def fetch_page(url): try: logger.info(f"发起请求: {url}") response = requests.get(url, timeout=10) response.raise_for_status() logger.debug(f"响应状态码: {response.status_code}") return response.text except requests.exceptions.RequestException as e: logger.error(f"请求失败: {url} - 错误: {str(e)}") return None ``` ##### **示例:数据解析记录** ```python from bs4 import BeautifulSoup def parse_data(html): try: soup = BeautifulSoup(html, 'html.parser') title = soup.title.text.strip() logger.info(f"解析成功,标题: {title}") return title except AttributeError as e: logger.warning("页面缺少标题标签") return None ``` ##### **示例:数据存储记录** ```python import sqlite3 def save_to_db(data): conn = None try: conn = sqlite3.connect('data.db') cursor = conn.cursor() cursor.execute("INSERT INTO pages (content) VALUES (?)", (data,)) conn.commit() logger.info("数据存储成功") except sqlite3.Error as e: logger.error(f"数据库错误: {str(e)}") conn.rollback() finally: if conn: conn.close() ``` --- #### 3. **异常捕获与堆栈跟踪** 通过`exc_info=True`记录完整错误信息: ```python def main(): try: html = fetch_page("https://example.com") if html: title = parse_data(html) save_to_db(title) except Exception as e: logger.critical("爬虫崩溃!", exc_info=True) # 记录堆栈信息 ``` --- #### 4. **日志级别控制** - **调试阶段**:使用`DEBUG`级别记录详细流程。 - **生产环境**:调整为`INFO`或`WARNING`,通过修改`logger.setLevel(logging.INFO)`实现。 --- #### 5. **日志脱敏与过滤** 若需隐藏敏感信息(如API密钥),可自定义过滤器: ```python class SensitiveFilter(logging.Filter): def filter(self, record): record.msg = record.msg.replace("API_KEY=123", "API_KEY=****") return True logger.addFilter(SensitiveFilter()) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值