python logging日誌輸出模塊簡要使用

前言

在我的前一篇博客《spyder for python調試功能》中其實調試存在一些問題:假如你是使用模板建立項目(比如Scrapy爬蟲項目),項目是在外部運行的,難以在編輯器實現調試功能。但是,爲了不暴露我的實力,我還是拒絕使用print

這就要介紹日誌了,
相信你多多少少打開過一些日誌文件,裏面密密麻麻都是時間和時間。
而python內置也有輸出這樣一些文件的模塊logging

在這裏插入圖片描述

使用場景

假如你的代碼是處理500000張圖片,對他們進行統一大小。那麼,你要知道,其中一些文件可能是損壞的,你需要記錄!而當很多圖片都有錯誤時,你不可能靠輸出錯誤到控制檯再手工複製尋找有問題的圖片,況且,可能還有一些其他的信息要輸出。

正文

該模塊的基本使用包括

  • 定義輸出格式
  • 輸出到控制檯
  • 輸出到文件
  • 捕獲異常
    最簡單的示例—輸出到控制檯
import logging 
#logging.basicConfig(level=logging.DEBUG)
logging.debug("調試信息")
logging.info("普通信息")
logging.warning("警告信息")
logging.error("錯誤信息")
logging.critical("嚴重錯誤信息")

輸出(控制檯)

WARNING:root:警告信息
ERROR:root:錯誤信息
CRITICAL:root:嚴重錯誤信息
日誌的級別

critical>error>warning>info>debug
所以你要根據你信息的重要程度選擇級別
默認只有warning級別及以上的纔會輸出(上面註釋那條命令就是把輸出級別定爲debug)

文件直接在spyder運行會有問題,比如還是輸出不了debug級別,還有下面要介紹的時間,文件也輸出不了,所以學習時建議在cmd運行py文件

定義輸出格式

最簡單的就是再修改上面註釋那條代碼

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
"""
修改這代碼後運行最初代碼,輸出爲
2018-10-30 21:58:58,221 - untitled0.py[line:10] - DEBUG: 調試信息
2018-10-30 21:58:58,221 - untitled0.py[line:11] - INFO: 普通信息
2018-10-30 21:58:58,222 - untitled0.py[line:12] - WARNING: 警告信息
2018-10-30 21:58:58,222 - untitled0.py[line:13] - ERROR: 錯誤信息
2018-10-30 21:58:58,222 - untitled0.py[line:14] - CRITICAL: 嚴重錯誤信息

這裏format就是定義一個輸出的格式化信息
"""

format常用格式表

輸出說明 對應代碼 解釋
時間 %(asctime)s 固定寫法
信息級別 %(levelname)s format內,除了這裏面的特殊變量,
文件名 %(filename)s 其他照樣輸出
代碼所在行數 %(lineno)d ----
文件路徑 %(pathname)s ----
函數名稱 %(funcName)s ----
信息主體 %(message)s ----
輸出到文件

輸出到文件需要稍微複雜一丟丟

import logging

file_log = './.log'  ##輸出的文件名
formatter = logging.Formatter("%(asctime)s - %(filename)s - [line:%(lineno)d] - %(levelname)s: %(message)s")  ##輸出的格式
"""首先實例化一個對象log"""
log = logging.getLogger()
log.setLevel(logging.DEBUG)  ##設置總的最低輸出級別
"""在定義一個輸出到文件的處理器"""
FileHandler = logging.FileHandler(file_log, mode='w')  ##以寫的模式,綁定了文件
FileHandler.setLevel(logging.WARNING)  ##設置輸出到文件的最低輸出級別
FileHandler.setFormatter(formatter)   ##設置輸出到文件的格式
log.addHandler(FileHandler)  ##添加到對象log
"""在定義一個輸出到控制檯的處理器"""
CmdHandler = logging.StreamHandler()
CmdHandler.setLevel(logging.DEBUG)  ##設置輸出到控制檯的最低輸出級別
CmdHandler.setFormatter(formatter)  ##設置輸出到控制檯的格式
log.addHandler(CmdHandler)   ##添加到對象log
"""添加了兩個處理器,這將會同時輸出到文件和控制檯,如果需要捨棄就刪除對應處理器即可"""
log.debug("調試信息")
log.info("普通信息")
log.warning("警告信息")
log.error("錯誤信息")
log.critical("嚴重錯誤信息")
捕獲異常

這很簡單
只需在上面代碼基礎上追加

try:
    open('/????/exist', 'rb')
except Exception as e:
    log.error('Failed to open file', exc_info=True)
"""
輸出信息:
untitled0.py--2018-10-30 22:35:38,381 - [line:20] - WARNING: 警告信息
untitled0.py--2018-10-30 22:35:38,381 - [line:21] - ERROR: 錯誤信息
untitled0.py--2018-10-30 22:35:38,382 - [line:22] - CRITICAL: 嚴重錯誤信息
untitled0.py--2018-10-30 22:35:38,383 - [line:27] - ERROR: Failed to open file
Traceback (most recent call last):
  File "untitled0.py", line 25, in <module>
    open('/path/to/does/not/exist', 'rb')
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/does/not/exist'
"""

別以爲最後面是普通的錯誤輸出!!!
exc_info=True 意思是把錯誤信息也一起輸出
在這裏插入圖片描述
當然你也可以

try:
    open('/path/to/does/not/exist', 'rb')
except Exception as e:
    log.error(e)

到此,日誌輸出的基本操作你就掌握了,將他用於你的項目中把!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章