2011-12-16 19 views
16

Tôi đã quyết định sử dụng mô-đun ghi nhật ký Python vì các thông báo được tạo bởi Twisted on std error quá dài và tôi muốn các thông báo có ý nghĩa ở mức INFO. bởi các StatsCollector được viết trên một tệp nhật ký riêng biệt trong khi duy trì các thông báo trên màn hình.Phế liệu - đăng nhập vào tệp và stdout đồng thời, với tên nhện

from twisted.python import log 
    import logging 
    logging.basicConfig(level=logging.INFO, filemode='w', filename='buyerlog.txt') 
    observer = log.PythonLoggingObserver() 
    observer.start() 

Vâng, điều này là tốt, tôi đã nhận được thư của mình, nhưng nhược điểm là tôi không biết thư được tạo ra bởi con nhện nào! Đây là tập tin đăng nhập của tôi, với "xoắn" được trình bày bởi %(name)s:

INFO:twisted:Log opened. 
    2 INFO:twisted:Scrapy 0.12.0.2543 started (bot: property) 
    3 INFO:twisted:scrapy.telnet.TelnetConsole starting on 6023 
    4 INFO:twisted:scrapy.webservice.WebService starting on 6080 
    5 INFO:twisted:Spider opened 
    6 INFO:twisted:Spider opened 
    7 INFO:twisted:Received SIGINT, shutting down gracefully. Send again to force unclean shutdown 
    8 INFO:twisted:Closing spider (shutdown) 
    9 INFO:twisted:Closing spider (shutdown) 
10 INFO:twisted:Dumping spider stats: 
11 {'downloader/exception_count': 3, 
12 'downloader/exception_type_count/scrapy.exceptions.IgnoreRequest': 3, 
13 'downloader/request_bytes': 9973, 

So với các thông điệp được tạo ra từ xoắn trên sai số chuẩn:

2011-12-16 17:34:56+0800 [expats] DEBUG: number of rules: 4 
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023 
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 
2011-12-16 17:34:56+0800 [iproperty] INFO: Spider opened 
2011-12-16 17:34:56+0800 [iproperty] DEBUG: Redirecting (301) to <GET http://www.iproperty.com.sg/> from <GET http://iproperty.com.sg> 
2011-12-16 17:34:57+0800 [iproperty] DEBUG: Crawled (200) < 

tôi đã cố gắng% (name) s ,% (module) s trong số những người khác nhưng tôi dường như không thể hiển thị tên nhện. Có ai biết câu trả lời không?

EDIT: vấn đề với việc sử dụng LOG_FILELOG_LEVEL trong cài đặt là những thông điệp cấp thấp hơn sẽ không được hiển thị trên lỗi std.

+0

nơi mà bạn đã đặt mã của bạn? setting.py hoặc mã nhện? –

Trả lời

22

Bạn muốn sử dụng số ScrapyFileLogObserver.

import logging 
from scrapy.log import ScrapyFileLogObserver 

logfile = open('testlog.log', 'w') 
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG) 
log_observer.start() 

Tôi rất vui vì bạn đã đặt câu hỏi này, tôi muốn tự mình làm điều này.

+0

sau khi thêm các dòng này trong settings.py của tôi, có thể không tìm thấy trình thu thập dữ liệu của tôi. (dòng lệnh) – goh

+0

Hmm, tôi đặt nó vào mô-đun nhện của tôi và nó hoạt động tốt .. hãy để tôi thử nghiệm. ** Chỉnh sửa: ** cách đặt nó trong tệp '__init__' của mô-đun trình thu thập thông tin của bạn? Điều đó dường như thực hiện công việc. – Acorn

+0

Hmm, đặt nó vào trình thu thập thông tin. Vui vì sao nó không hoạt động trong settings.py. Ngoài ra, tôi không thể tìm thấy ScrapyFileObserver này ở bất kỳ đâu trong tài liệu. Có lẽ bạn có thể hướng dẫn tôi đến liên kết (khác với github)? – goh

11

Nó là rất dễ dàng để chuyển hướng đầu ra sử dụng: scrapy some-scrapy's-args 2>&1 | tee -a logname

Bằng cách này, tất cả những gì scrapy ouputs vào stdout và stderr, sẽ được chuyển hướng đến một tập tin LOGNAME và cũng có, prited vào màn hình.

+0

Đã hoạt động hoàn hảo! Đó là lý tưởng để phát triển, khi chúng tôi chỉ đơn giản là thử nghiệm với scrapers và đăng nhập là quá dài để giữ trong thiết bị đầu cuối, nhưng chúng tôi không muốn mã toàn bộ python đăng nhập trong nhện chỉ được nêu ra. – CloudRide

5

Tôi biết điều này là cũ nhưng đó là một bài đăng thực sự hữu ích vì lớp học vẫn không được ghi chép chính xác trong tài liệu Scrapy. Ngoài ra, chúng tôi có thể bỏ qua việc nhập nhật ký và sử dụng nhật ký sơ lược trực tiếp. Cảm ơn tất cả!

from scrapy import log 

logfile = open('testlog.log', 'a') 
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG) 
log_observer.start() 
7

Đối với tất cả những folks người đến đây trước khi đọc phiên bản hiện tại documentation:

import logging 
from scrapy.utils.log import configure_logging 

configure_logging(install_root_handler=False) 
logging.basicConfig(
    filename='log.txt', 
    filemode = 'a', 
    format='%(levelname)s: %(message)s', 
    level=logging.DEBUG 
) 
Các vấn đề liên quan