scrapy自定义日志

  1. 自定义日志系统

首先,在Scrapy的settings.py文件中添加以下代码:

LOG_LEVEL = 'DEBUG'  # 日志级别
LOG_FILE = '/path/to/logfile.log'  # 日志文件路径
LOG_ENABLED = True  # 是否启用日志
LOG_STDOUT = False  # 是否输出到标准输出

这些设置将指定Scrapy日志的级别,文件路径和是否启用日志。您还可以将日志输出到标准输出或在默认情况下禁用此功能。

接下来,您可以使用Python的built-in logging模块自定义Scrapy日志记录器。以下是一个例子:

import logging

class CustomLogger(object):
    def __init__(self):
        self.logger = logging.getLogger('scrapy')
        self.logger.setLevel(logging.DEBUG)

        # 创建一个文件处理程序,将日志记录到文件中
        fh = logging.FileHandler('/path/to/logfile.log')
        fh.setLevel(logging.DEBUG)

        # 创建一个控制台处理程序,将日志记录到控制台上
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 创建一个日志格式器,用于将记录格式化为字符串
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

        # 将日志格式器添加到文件和控制台处理程序
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 将文件和控制台处理程序添加到日志记录器
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def info(self, msg):
        self.logger.info(msg)

    def debug(self, msg):
        self.logger.debug(msg)

    def warning(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)

这个自定义日志记录器创建了一个名为“scrapy”的日志记录器,并将日志输出到文件和控制台。还实现了info(),debug(),warning(),error()和critical()方法,以便您可以使用自己的日志记录器记录不同级别的日志信息。

  1. 保留日志文件并上传报错信息

以下是一个例子,将保留Scrapy日志文件,如果出现报错信息,则将报错信息上传到数据库中:

import logging
import os
import datetime

class CustomLogger(object):
    def __init__(self):
        self.logger = logging.getLogger('scrapy')
        self.logger.setLevel(logging.DEBUG)

        # 创建一个文件处理程序,将日志记录到文件中
        self.log_file = '/path/to/logfile.log'
        fh = logging.FileHandler(self.log_file)
        fh.setLevel(logging.DEBUG)

        # 创建一个控制台处理程序,将日志记录到控制台上
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)

        # 创建一个日志格式器,用于将记录格式化为字符串
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

        # 将日志格式器添加到文件和控制台处理程序
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)

        # 将文件和控制台处理程序添加到日志记录器
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)

    def info(self, msg):
        self.logger.info(msg)

    def debug(self, msg):
        self.logger.debug(msg)

    def warning(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

        # 保留日志文件并上传报错信息
        if os.path.exists(self.log_file):
            with open(self.log_file, 'r') as f:
                log_content = f.read()
            project_id = '123456'  # 项目ID
            error_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 错误时间
            error_reason = msg  # 错误原因
            # 将报错信息上传到数据库中
            # db.upload_error(project_id, error_time, error_reason, log_content)

    def critical(self, msg):
        self.logger.critical(msg)

这个例子只是展示了如何保留Scrapy日志文件,并在出现错误时将错误信息上传到数据库中,如果需要上传报错信息到数据库,您需要根据自己的需求进行相应修改。

希望这个例子对您有所帮助!