# Logging
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
注解
`scrapy.log` 已經不贊成與函數一起使用,而贊成顯式調用Python標準日志記錄。繼續閱讀以了解有關新日志記錄系統的更多信息。
Scrapy 用途 [Python's builtin logging system](https://docs.python.org/3/library/logging.html) 用于事件日志記錄。我們將提供一些簡單的示例來幫助您入門,但對于更高級的用例,強烈建議您仔細閱讀其文檔。
日志記錄是開箱即用的,可以在某種程度上使用中列出的碎片設置進行配置。 [日志記錄設置](#topics-logging-settings) .
Scrapy電話 [`scrapy.utils.log.configure_logging()`](#scrapy.utils.log.configure_logging "scrapy.utils.log.configure_logging") 設置一些合理的默認值并在 [日志記錄設置](#topics-logging-settings) 當運行命令時,建議在運行腳本的scrapy時手動調用它,如中所述。 [從腳本中運行Scrapy](practices.html#run-from-script) .
## 日志級別
python的內置日志記錄定義了5個不同的級別,以指示給定日志消息的嚴重性。以下是標準的,按降序排列:
1. `logging.CRITICAL` -對于嚴重錯誤(嚴重性最高)
2. `logging.ERROR` -對于常規錯誤
3. `logging.WARNING` -用于警告消息
4. `logging.INFO` -以獲取信息性消息
5. `logging.DEBUG` -用于調試消息(最低嚴重性)
## 如何記錄消息
下面是如何使用 `logging.WARNING`
```py
import logging
logging.warning("This is a warning")
```
在標準的5個級別中,有一個用于發布日志消息的快捷方式,還有一個常規的 `logging.log` 方法,該方法將給定的級別作為參數。如果需要,最后一個示例可以重寫為:
```py
import logging
logging.log(logging.WARNING, "This is a warning")
```
除此之外,您還可以創建不同的“記錄器”來封裝消息。(例如,常見的做法是為每個模塊創建不同的記錄器)。這些記錄器可以獨立配置,并且允許層次結構。
前面的示例在后臺使用根記錄器,它是一個頂級記錄器,所有消息都在其中傳播(除非另有規定)。使用 `logging` 幫助程序只是顯式獲取根記錄器的快捷方式,因此這也相當于最后一段代碼:
```py
import logging
logger = logging.getLogger()
logger.warning("This is a warning")
```
您可以使用不同的記錄器,只需將其名稱 `logging.getLogger` 功能:
```py
import logging
logger = logging.getLogger('mycustomlogger')
logger.warning("This is a warning")
```
最后,通過使用 `__name__` 變量,用當前模塊的路徑填充:
```py
import logging
logger = logging.getLogger(__name__)
logger.warning("This is a warning")
```
參見
```py
模塊日志記錄,
```
基本日志教程
```py
模塊日志記錄,
```
關于伐木工人的進一步文件
## 從 Spider 記錄
Scrapy提供了 [`logger`](spiders.html#scrapy.spiders.Spider.logger "scrapy.spiders.Spider.logger") 在每個 Spider 實例中,可以這樣訪問和使用:
```py
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://scrapinghub.com']
def parse(self, response):
self.logger.info('Parse function called on %s', response.url)
```
這個記錄器是使用 Spider 的名稱創建的,但是您可以使用任何您想要的自定義Python記錄器。例如::
```py
import logging
import scrapy
logger = logging.getLogger('mycustomlogger')
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://scrapinghub.com']
def parse(self, response):
logger.info('Parse function called on %s', response.url)
```
## 日志記錄配置
日志記錄者自己不管理如何顯示通過它們發送的消息。對于此任務,可以將不同的“處理程序”附加到任何記錄器實例,它們將這些消息重定向到適當的目標,例如標準輸出、文件、電子郵件等。
默認情況下,scrappy根據下面的設置為根記錄器設置和配置處理程序。
### 日志記錄設置
這些設置可用于配置日志記錄:
* [`LOG_FILE`](settings.html#std:setting-LOG_FILE)
* [`LOG_ENABLED`](settings.html#std:setting-LOG_ENABLED)
* [`LOG_ENCODING`](settings.html#std:setting-LOG_ENCODING)
* [`LOG_LEVEL`](settings.html#std:setting-LOG_LEVEL)
* [`LOG_FORMAT`](settings.html#std:setting-LOG_FORMAT)
* [`LOG_DATEFORMAT`](settings.html#std:setting-LOG_DATEFORMAT)
* [`LOG_STDOUT`](settings.html#std:setting-LOG_STDOUT)
* [`LOG_SHORT_NAMES`](settings.html#std:setting-LOG_SHORT_NAMES)
前兩個設置定義日志消息的目標。如果 [`LOG_FILE`](settings.html#std:setting-LOG_FILE) 設置后,通過根記錄器發送的消息將被重定向到名為 [`LOG_FILE`](settings.html#std:setting-LOG_FILE) 帶編碼 [`LOG_ENCODING`](settings.html#std:setting-LOG_ENCODING) . 如果未設置 [`LOG_ENABLED`](settings.html#std:setting-LOG_ENABLED) 是 `True` ,將在標準錯誤上顯示日志消息。最后,如果 [`LOG_ENABLED`](settings.html#std:setting-LOG_ENABLED) 是 `False` ,將不會有任何可見的日志輸出。
[`LOG_LEVEL`](settings.html#std:setting-LOG_LEVEL) 確定要顯示的最低嚴重性級別,將篩選出嚴重性較低的消息。它的范圍包括 [日志級別](#topics-logging-levels) .
[`LOG_FORMAT`](settings.html#std:setting-LOG_FORMAT) 和 [`LOG_DATEFORMAT`](settings.html#std:setting-LOG_DATEFORMAT) 指定用作所有消息布局的格式字符串。這些字符串可以包含中列出的任何占位符 [logging's logrecord attributes docs](https://docs.python.org/2/library/logging.html#logrecord-attributes) 和 [datetime's strftime and strptime directives](https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior) 分別。
如果 [`LOG_SHORT_NAMES`](settings.html#std:setting-LOG_SHORT_NAMES) 設置后,日志將不會顯示打印日志的 Scrapy 組件。默認情況下,它是未設置的,因此日志包含負責該日志輸出的廢料組件。
### 命令行選項
有一些命令行參數可用于所有命令,您可以使用這些參數來覆蓋有關日志記錄的一些零碎設置。
* ```py
--logfile FILE
```
重寫 [`LOG_FILE`](settings.html#std:setting-LOG_FILE)
* ```py
--loglevel/-L LEVEL
```
重寫 [`LOG_LEVEL`](settings.html#std:setting-LOG_LEVEL)
* ```py
--nolog
```
集合 [`LOG_ENABLED`](settings.html#std:setting-LOG_ENABLED) 到 `False`
參見
```py
模塊
```
有關可用處理程序的進一步文檔
### 高級自定義
因為scrapy使用stdlib日志記錄模塊,所以可以使用stdlib日志記錄的所有功能自定義日志記錄。
例如,假設您正在抓取一個返回許多HTTP 404和500響應的網站,并且您希望隱藏像這樣的所有消息:
```py
2016-12-16 22:00:06 [scrapy.spidermiddlewares.httperror] INFO: Ignoring
response <500 http://quotes.toscrape.com/page/1-34/>: HTTP status code
is not handled or not allowed
```
首先要注意的是一個記錄器名稱-它在括號中: `[scrapy.spidermiddlewares.httperror]` . 如果你得到公正 `[scrapy]` 然后 [`LOG_SHORT_NAMES`](settings.html#std:setting-LOG_SHORT_NAMES) 可能設置為true;設置為false并重新運行爬網。
接下來,我們可以看到消息具有信息級別。為了隱藏它,我們應該為 `scrapy.spidermiddlewares.httperror` 高于信息;信息后的下一級是警告。可以這樣做,例如在 Spider 的 `__init__` 方法:
```py
import logging
import scrapy
class MySpider(scrapy.Spider):
# ...
def __init__(self, *args, **kwargs):
logger = logging.getLogger('scrapy.spidermiddlewares.httperror')
logger.setLevel(logging.WARNING)
super().__init__(*args, **kwargs)
```
如果您再次運行此 Spider ,則從 `scrapy.spidermiddlewares.httperror` 日志記錄器將消失。
## scrapy.utils.log模塊
```py
scrapy.utils.log.configure_logging(settings=None, install_root_handler=True)
```
初始化Scrapy的日志記錄默認值。
| 參數: |
* **settings** (dict, [`Settings`](api.html#scrapy.settings.Settings "scrapy.settings.Settings") object or `None`) -- 用于創建和配置根記錄器處理程序的設置(默認值:無)。
* **install_root_handler** (_bool_) -- 是否安裝根日志記錄處理程序(默認值:true)
|
| --- | --- |
此功能可以:
* 通過python標準日志記錄路由警告和扭曲日志記錄
* 分別將調試和錯誤級別分配給殘缺和扭曲的記錄器
* 如果日志輸出設置為真,則將stdout路由到日志
什么時候? `install_root_handler` 為true(默認值),此函數還根據給定的設置為根記錄器創建處理程序(請參見 [日志記錄設置](#topics-logging-settings) )可以使用替代默認選項 `settings` 爭論。什么時候? `settings` 為空或無,使用默認值。
`configure_logging` 在使用scrappy命令時自動調用,但在運行自定義腳本時需要顯式調用。在這種情況下,不需要使用它,但建議使用它。
如果您計劃自己配置處理程序,仍然建議您調用此函數,通過 `install_root_handler=False` . 請記住,在這種情況下,不會默認設置任何日志輸出。
要開始手動配置日志輸出,可以使用 [logging.basicConfig()](https://docs.python.org/2/library/logging.html#logging.basicConfig) 設置基本根處理程序。這是一個關于如何重定向的示例 `INFO` 或更高的文件消息:
```py
import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
filename='log.txt',
format='%(levelname)s: %(message)s',
level=logging.INFO
)
```
參照 [從腳本中運行Scrapy](practices.html#run-from-script) 有關使用scrapy的更多詳細信息。
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性