簡體   English   中英

Scrapy/Celery 日志記錄設置不起作用

[英]Scrapy/Celery logging settings doesn't work

我將 Scrapy spider 作為 Celery 任務運行。

問題是 Scrapy 沒有登錄到文件scrapy.log 它登錄到 Celery 日志中。 此外,我可以在 Celery 日志中看到 DEBUG 級別,我不知道是因為 celery 設置還是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 日志記錄級別設置為信息:

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)

我在調試模式下有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: WARNING/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')

哪個有效,但像“Crawled”這樣的原生scrapy消息正在進入芹菜日志。

我試圖在蜘蛛__init__中做到這一點:

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

返回錯誤(無法設置屬性)。

所以有兩個問題: 1. Celery 記錄 DEBUG 消息 2. Scrapy 記錄到 celery.log

alfonso.kim's answer doesn't work because django ignores all non UPPERCASED settings values花了很多時間來調試這個

因此,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,但只能以大寫形式

我不知道這是否行得通,但是您可以給它一個機會。

似乎celery覆蓋了日志記錄配置。 由於您是通過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',
        }
    }
}

並沙啞:

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

最后,從celery命令中刪除logfile指令。

希望這可以幫助。

Celery正在覆蓋日志記錄配置

嘗試:

CELERY_worker_hijack_root_logger=FALSE

為此,您應該在您的yourproject/celery.py啟用CELERY作為名稱空間:

app.config_from_object('django.conf:settings', namespace='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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM