我正在运行Scrapy蜘蛛作为Celery任务。
问题是Scrapy没有登录文件scrapy.log
。它登录到芹菜日志中。此外,我可以看到芹菜日志中的DEBUG级别,我不知道是不是因为芹菜设置或scrapy设置。
[2017-07-17 05:49:20,848:WARNING / 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 LOG_LEVEL和LOG_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)
我在DEBUG模式下Django
。
你知道该怎么办吗?如何将celery loglevel设置为INFO和Scrapy以记录它自己的文件。
编辑:
这就是我运行蜘蛛的方式:
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)
RUN CELERY WORKER:
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:警告/流程-1:1] 2017-07-17 11:10:47 [topreality_1]信息:跳过电话请求......
[2017-07-17 11:10:48,680:DEBUG / Process-1:1]抓取(200)
我试图这样做(alfonsos回答):
import logging
logger = logging.getLogger('scrapy')
...
logger.debug('something')
哪个有效,但原生的scrapy消息如" Crawled"正在进入芹菜日志。
我试图在蜘蛛__init__
中执行此操作:
self.logger = logging.getLogger('scrapy')
返回错误(无法设置属性)。
所以有两个问题: 1. Celery记录DEBUG消息 2. Scrapy登录到celery.log
答案 0 :(得分:0)
我不知道这是否有效,但你可以给它一个机会。
似乎celery正在覆盖日志记录配置。由于您是通过Django使用它,因此可以使用它logging capabilities:
settings.py
中的:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'scrapy': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/scrapy.log'),
'formatter': 'simple'
}
},
'loggers': {
'celery': {
'handlers': ['console'],
'level': 'DEBUG',
},
'scrapy': {
'handlers': ['scrapy'],
'level': 'DEBUG',
}
}
}
和scrapy:
import logging
logger = logging.getLogger('scrapy')
...
logger.debug('something')
最后,从celery命令中删除logfile
指令。
希望这有帮助。
答案 1 :(得分:0)
芹菜是overriding the logging configuration。
尝试:
J8BC`````
要实现此功能,您应该CELERY_worker_hijack_root_logger=FALSE
中的CELERY
启用yourproject/celery.py
:
app.config_from_object('django.conf:settings', namespace='CELERY')
希望这有帮助。
答案 2 :(得分:0)
有同样的问题。 发现芹菜捕获了根记录器的输出 并将它们记录为调试
将其作为我的任务解决了我的问题
@app.task(name= "cralwer")
def crawler(spider):
log_file = '/home/chamanmah/scrapyd/logs/pricewatch/'+spider+'/a.log'
setting = get_project_settings()
runner = CrawlerProcess(setting,install_root_handler=False)
# crating file log handler
fh = logging.handlers.RotatingFileHandler(log_file)
fh.setLevel(logging.DEBUG)
# changing root log handeler that is <StreamHandler <stderr> (NOTSET)> before this line
logging.getLogger().handlers = [fh]
d = runner.crawl(spider)
d.addBoth(lambda _: reactor.stop())
reactor.run()