这是我的Scrapy代码......我是从Scrapy official documentation
复制的import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
filename='log.txt',
format='%(levelname)s: %(message)s',
level=logging.INFO,
filemode = 'w'
)
现在的问题是,即使错误阈值为“INFO”,它仍会在日志中打印“DEBUG”消息。
有人为什么会这样吗?在我需要配置的其他地方还有其他设置吗?
此外,如果我在settings.py文件中设置以下标志,它可以正常工作(如预期的那样)......
LOG_FILE = 'mylog.txt'
LOG_LEVEL = 'INFO'
我没有在日志中看到任何'DEBUG'消息。但是每次运行爬虫时它只会附加到日志文件中。我需要清除文件并在每次抓取时再次写入。
由于
答案 0 :(得分:1)
如果从命令行运行scrapy,则不需要此logging
配置,因为默认情况下已调用它(更多信息here)。而是在settings.py
文件中设置变量:
LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_LEVEL = 'INFO'
# DON'T SET LOG_FILE
现在,scrapy目前不支持直接记录文件模式(我sending a PR添加此功能),但您可以使用以下命令将终端输出重定向到文件(并始终覆盖它):
scrapy crawl myspider &> file.log
请注意,仅当您不设置LOG_FILE
时才会有效(因为它会创建FileHandler
而不是StreamHandler
)。
答案 1 :(得分:1)
您可以通过首先在scrapy.utils.log.configure_logging中禁用根句柄,然后添加自己的日志处理程序并根据需要自定义日志级别(从DEBUG到INFO)和格式化程序,来将所有scrapy日志记录到文件中。
在scrapy项目的settings.py文件中,添加以下代码:
import logging
from logging.handlers import RotatingFileHandler
from scrapy.utils.log import configure_logging
LOG_ENABLED = False
# Disable default Scrapy log settings.
configure_logging(install_root_handler=False)
# Define your logging settings.
log_file = '/tmp/logs/CRAWLER_logs.log'
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rotating_file_log = RotatingFileHandler(log_file, maxBytes=10485760, backupCount=1)
rotating_file_log.setLevel(logging.INFO)
rotating_file_log.setFormatter(formatter)
root_logger.addHandler(rotating_file_log)
希望这会有所帮助!
答案 2 :(得分:0)
有人为什么会这样吗?
第一
logging.basicConfig(
filename='log.txt',
format='%(levelname)s: %(message)s',
level=logging.INFO,
filemode = 'w'
)
当我们在settings.py中使用上面的日志记录功能配置日志时,实际上是为这个scrapy项目设置了根记录器。
第二
configure_logging(install_root_handler=False)
configure_logging
做什么?是document says:
此功能可以: -通过Python标准日志记录路由警告和扭曲日志记录 -分别为Scrapy和Twisted记录器分配DEBUG和ERROR级别 -如果LOG_STDOUT设置为True,则将stdout路由到日志
,并且scrapy的记录器消息已传播到其父记录器,并且您在settings.py中设置的父记录器将不检查级别,这是不直观的行为。
那是我们在记录器文件中获得调试和信息消息的原因
我还需要配置其他设置吗?
我个人认为,scrapy带来的很多信息是有帮助的,其中一些对于我的项目是多余的。
这是我的做法:
向处理程序添加过滤器:
def filter_out_item(record):
"""
filter out item log in scraper
"""
if record.levelno < logging.WARNING \
and record.module == 'scraper':
return False
return True
file_handler = logging.FileHandler('path_to_handler')
file_handler.addFilter(filter_out_item)
logging.basicConfig(
handler=[file_handler,],
format='%(levelname)s: %(message)s',
level=logging.INFO
)
或者,如果要全局设置级别,只需设置处理程序级别
file_handler.setLevel(logging.INFO)
此设置将忽略所有低于INFO的消息级别,然后您将不会从scrapy模块中看到低于INFO的任何消息
希望此代码示例对您有所帮助