Scrapy/Celery 日志记录设置不起作用

问题描述 投票:0回答:5

我正在将 Scrapy Spider 作为 Celery 任务运行。

问题是Scrapy没有登录到文件

scrapy.log
。它会记录到 Celery 日志中。而且,我可以在 Celery 日志中看到 DEBUG 级别,我不知道这是因为 celery 设置还是 scrapy 设置。

[2017-07-17 05:49:20,848:警告/过程-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 日志记录级别设置为信息:

celery worker -A realestate_scanner -l info --logfile=logs/celery.log --purge

我已经在 SCRAPY 中设置了 scrapy LOG_LEVEL 和 LOG_FILE

settings.py
:

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 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)

运行芹菜工人:

celery worker -A realestate_scanner -l info --logfile=logs/celery.log --purge # When I remove --logfile, everything goes into the console

启动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)

我尝试这样做(阿方索答案):

import logging
logger = logging.getLogger('scrapy')
...
logger.debug('something')

这有效,但像“Crawled”这样的原生 scrapy 消息将进入 celery 日志。

我尝试在蜘蛛中执行此操作

__init__

self.logger = logging.getLogger('scrapy') 

返回错误(无法设置属性)。

所以有两个问题: 1. Celery 记录 DEBUG 消息 2. Scrapy日志写入celery.log

python django logging scrapy celery
5个回答
1
投票

alfonso.kim 的答案不起作用,因为django忽略所有非大写设置值 花了很多时间调试这个

所以,celery 从 6.0 开始将忽略大写设置

但是现在(版本5.2)你需要忽略 celery 文档并将大写的设置值添加到你的settings.py中:

CELERY_WORKER_HIJACK_ROOT_LOGGER = False

Celery 不会覆盖日志配置之后

不要忘记在 yourproject/celery.py 中启用 CELERY_ 工作区:

app.config_from_object('django.conf:settings', namespace='CELERY')

之后,您可以将 任何 celery 设置添加到您的 settings.py 中,但仅限于 大写


0
投票

我不知道这是否有效,但你可以给它一个机会。

芹菜似乎覆盖了日志配置。由于您是通过 Django 使用它,因此您可以使用它的日志记录功能:

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
指令。

希望这有帮助。


0
投票

Celery 覆盖日志配置

尝试:

CELERY_worker_hijack_root_logger=FALSE

为此,您应该启用

CELERY
作为
yourproject/celery.py
中的命名空间:

app.config_from_object('django.conf:settings', namespace='CELERY')

希望这有帮助。


0
投票

有同样的问题。 发现 celery 捕获根记录器输出 并将它们记录为调试

将此作为我的任务解决了我的问题

@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()

0
投票
celery -A celery_worker worker -l info
© www.soinside.com 2019 - 2024. All rights reserved.