我正在运行Scrapy蜘蛛作为celery 任务。
问题是Scrapy没有登录到scrapy.log
文件。它登录到Celery日志。此外,我可以看到Celery日志中的调试级别,我不知道这是因为celery设置还是scrapy设置。
[2017-07-17 05:49:20,848:/Process-4:1] 2017-07-17 05:49:20 [spider_1]信息:跳过电话请求...
[2017-07-17 05:49:22,277:DEBUG/Process-4:1]抓取(200)https://w.
我已将Celery日志记录级别设置为info:
celery worker -A realestate_scanner -l info --logfile=logs/celery.log --purge
字符串
我在SCRAPY settings.py
中设置了scrapy_LEVEL和scrapy_FILE:
LOG_LEVEL = 'INFO'
LOG_FILE = django_dir+'/logs/scrapy.log'
型
Scrapy项目在我的一个Django应用程序中。
这是celery.py
:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'realestate_scanner.settings')
app = Celery('realestate_scanner')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
型
我有Django
在调试模式。
你知道该怎么做吗?如何将celery的日志级别设置为INFO,并将Scrapy设置为记录自己的文件。
编辑:
我是这样运行spider的:
logger = logging.getLogger(__file__)
handler = RotatingFileHandler(filename=__file__+'.log',maxBytes=64*64*64*64)
logger.addHandler(handler)
@periodic_task(run_every=timedelta(minutes=5))
def daily_scanning():
settings = get_project_settings()
settings.overrides['LOG_FILE']='scrapy.log'
logger.info('Scanning started') # this is also logged into celery.log
job = Job(TopRealitySpider1())
Processor().run(job)
logger.info('Scanning stopped')
型
settings.py(django):
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'simple': {
'format': '%(levelname)s %(message)s',
'datefmt': '%y %b %d, %H:%M:%S',
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'celery': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'logs/celery.log',
'formatter': 'simple',
'maxBytes': 1024 * 1024 * 100, # 100 mb
},
'scrapy': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/scrapy.log'),
'formatter': 'simple'
}
},
'loggers': {
'celery': {
'handlers': ['celery', 'console'],
'level': 'INFO',
},
'scrapy': {
'handlers': ['scrapy'],
'level': 'INFO',
}
},
}
from logging.config import dictConfig
dictConfig(LOGGING)
型
运行celery 工人:
celery worker -A realestate_scanner -l info --logfile=logs/celery.log --purge # When I remove --logfile, everything goes into the console
型
START SHELL_PLUS:
>>> tasks.daily_scanning.delay()
型
结果:
一个celery.log文件:
[2017-07-17 11:10:47,468:INFO/Process-1:1]正在跳过电话请求...
[2017-07-17 11:10:47,468:/Process-1:1] 2017-07-17 11:10:47 [topreality_1]信息:跳过电话请求...
[2017-07-17 11:10:48,680:DEBUG/Process-1:1]抓取(200)
我试着这样做(阿方索的回答):
import logging
logger = logging.getLogger('scrapy')
...
logger.debug('something')
型
这是可行的,但像“爬行”这样的本地零碎信息会进入celery 日志。
我尝试在spider __init__
中这样做:
self.logger = logging.getLogger('scrapy')
型
返回错误(无法设置属性)。
所以有两个问题:1. Celery日志DEBUG消息2. Scrapy日志进入celery.log
4条答案
按热度按时间vm0i2vca1#
alfonso.kim's answer不工作,因为django忽略了所有非大写设置值花了很多时间来调试这个
因此,celery将忽略自6.0以来的升级设置
但是现在(版本5.2),你需要忽略celery文档,并将更新的设置值添加到你的settings.py:
字符串
Celery不会覆盖日志记录配置,
不要忘记在yourproject/celery.py中启用**CELERY_**workspace:
型
在此之后,您可以将任何celery 设置添加到您的settings.py,但只能在大写
bkkx9g8r2#
我不知道这是否有用,但你可以给给予一个机会。
看起来celery覆盖了日志配置。因为你是通过Django使用它的,你可以使用它的logging capabilities:
在
settings.py
中:字符串
在Scrapy:
型
最后,从celery命令中删除
logfile
指令。希望这对你有帮助。
xhv8bpkk3#
Celery正在覆盖日志记录配置。
试试看:
字符串
要做到这一点,您应该在
yourproject/celery.py
中启用CELERY
作为命名空间:型
希望这对你有帮助。
olmpazwi4#
我有同样的问题。发现celery捕获根日志记录器输出并将其记录为调试
把这个作为我的任务解决了我的问题
字符串