Affected files: .obsidian/workspace 03. Programming/COM/20210726 - COM Interface.md 03. Programming/DB/MySQL.md 03. Programming/DB/sqlite.md 03. Programming/Design Pattern.md 03. Programming/FFMPEG/00. Introduction.md 03. Programming/FFMPEG/01. Setup.md 03. Programming/FFMPEG/FFMpeg.md 03. Programming/Flask.md 03. Programming/Media Foundation/20210604 - Windows media foundation.md 03. Programming/OpenCV.md 03. Programming/OpenGL.md 03. Programming/Python/argparse.ArgumentParser.md 03. Programming/Python/decorator.md 03. Programming/Python/logging.md 03. Programming/Python/opencv.md 03. Programming/Python/subprocess.md 03. Programming/Python/threading.md 03. Programming/Python/tkinter.md 03. Programming/Python/檢測工具.md 03. Programming/QT/Dropdown button.md 03. Programming/QT/QVariant.md 03. Programming/QT/Qt.md 03. Programming/UML.md 03. Programming/演算法.md 04. 資料收集/99. templates/blogHeader.md 04. 資料收集/99. templates/date.md 04. 資料收集/99. templates/front matter.md 04. 資料收集/99. templates/note.md 04. 資料收集/99. templates/table.md 04. 資料收集/99. templates/thisWeek.md 04. 資料收集/99. templates/日記.md 04. 資料收集/99. templates/讀書筆記.md 04. 資料收集/Linux/CLI/cut.md 04. 資料收集/Linux/CLI/scp.md 04. 資料收集/Linux/CLI/timedatectl.md 04. 資料收集/Linux/Programming.md 04. 資料收集/Linux/Ubuntu.md 04. 資料收集/Tool Setup/Hardware/RaspberryPi.md 04. 資料收集/Tool Setup/Software/Chrome.md 04. 資料收集/Tool Setup/Software/Obisidian.md 04. 資料收集/Tool Setup/Software/SublimeText.md 04. 資料收集/Tool Setup/Software/VirtualBox.md 04. 資料收集/Tool Setup/Software/Visual Studio Code.md 04. 資料收集/Tool Setup/Software/Windows Setup.md 04. 資料收集/Tool Setup/Software/Windows Terminal.md 04. 資料收集/Tool Setup/Software/freefilesync.md 04. 資料收集/Tool Setup/Software/vim.md 04. 資料收集/名言佳句.md 04. 資料收集/架站/Gitea.md 04. 資料收集/架站/HTTP Server/Apache.md 04. 資料收集/架站/HTTP Server/Nginx/Reverse Proxy(Layer4).md 04. 資料收集/架站/Pelican blog.md 04. 資料收集/架站/Proxmox VE.md 04. 資料收集/架站/SWAG Reverse proxy.md 04. 資料收集/架站/Storj.md 04. 資料收集/架站/Trojan.md 04. 資料收集/每週外食.md 04. 資料收集/科技/802.11.md 04. 資料收集/科技/HDR Sensor.md 04. 資料收集/科技/量子電腦.md 04. 資料收集/科技/鋰電池.md 04. 資料收集/興趣嗜好/RC/Traxxas Sledge.md 04. 資料收集/興趣嗜好/RC/好盈電變調整中立點.md 04. 資料收集/興趣嗜好/RC/差速器調教教學.md 04. 資料收集/興趣嗜好/模型/舊化作例.md 04. 資料收集/興趣嗜好/軍武/虎式.md 04. 資料收集/讀書筆記/20201201 - 學習如何學習.md 04. 資料收集/讀書筆記/20201218 - Kotlin權威2.0.md 04. 資料收集/讀書筆記/20201224 - 寫作是最好的自我投資.md 04. 資料收集/讀書筆記/20210119 - 中產悲歌.md 04. 資料收集/讀書筆記/20210220 - 最高學習法.md 04. 資料收集/讀書筆記/20210320 - 最高學以致用法.md 04. 資料收集/讀書筆記/20210406 - 精準購買.md 04. 資料收集/讀書筆記/20210723 - 高手學習.md 04. 資料收集/讀書筆記/20220526 - 深入淺出設計模式.md 04. 資料收集/讀書筆記/20220619 - 精確的力量.md 04. 資料收集/軟體工具/IPFS.md 04. 資料收集/軟體工具/MkDocs.md 04. 資料收集/軟體工具/Obsidian.md 04. 資料收集/軟體工具/docker.md 04. 資料收集/軟體工具/git/apply.md 04. 資料收集/軟體工具/git/submodule.md 04. 資料收集/軟體工具/youtube-dl.md 04. 資料收集/面試準備/技术面试最后反问面试官的话.md
7.7 KiB
7.7 KiB
準備
import logging
logging level
| level | level number | funtion |
|---|---|---|
| NOTSET | 0 | |
| DEBUG | 10 | logging.debug() |
| INFO | 20 | logging.info() |
| WARNING | 30 | logging.warning() |
| ERROR | 40 | logging.error() |
| CRITICAL | 50 | logging.critical() |
import logging
LOG_FORMAT = '%(asctime)s %(levelname)s: %(message)s'
LOG_FILENAME = 'C:\\RobotRun\\Output\\RobotRunDocUpdater.log'
logging.basicConfig(level=logging.INFO, filename=LOG_FILENAME, filemode='a', format=LOG_FORMAT)
logging.info('logging start')
Print Exception
logging 模組也提供可以紀錄完整的堆疊追蹤 (stack traces),若在 logging.error() 加上 exc_info 參數,並將該參數設為 True,就可以紀錄 Exception,如下:
import logging
try:
x = 5 / 0
except:
logging.error("Catch an exception.", exc_info=True)
也可以使用logging.exception("Catch an exception."),效果跟logging.error("Catch an exception.", exc_info=True)一樣。
自訂 logging 輸出格式
預設的訊息輸出格式只有 levelname、name、message,下面是其他相關的資訊:
| 格式化字串 | 說明 |
|---|---|
%(asctime)s |
日期時間, 格式為 YYYY-MM-DD HH:mm:SS,ms,例如:2018-12-13 17:20:30,567 |
%(filename)s |
模組檔名 |
%(funcName)s |
函數名稱 |
%(levelname)s |
日誌的等級名稱 |
%(levelno)s |
日誌的等級數值 |
%(lineno)d |
呼叫日誌函數所在的行數 |
%(message)s |
訊息 |
%(module)s |
模組名稱 |
%(name)s |
logger 的名稱 |
%(pathname)s |
檔案的完整路徑 (如果可用) |
%(process)d |
process ID (如果可用) |
%(thread)d |
執行緒 ID (如果可用) |
%(threradName)s |
執行緒名稱 |
例:
FORMAT = '%(asctime)s %(levelname)s: %(message)s'
logging.basicConfig(level=logging.DEBUG, format=FORMAT)
logging.debug('debug message') --> 2018-12-13 17:40:34,604 DEBUG: debug message
儲存log
只要在 logging.basicConfig() 內的 filename 參數設定要儲存的日誌檔名,就可以將 logging 儲存:
import logging
FORMAT = '%(asctime)s %(levelname)s: %(message)s'
logging.basicConfig(level=logging.DEBUG, filename='myLog.log', filemode='w', format=FORMAT)
logging.debug('debug message')
預設 filemode 參數是設為 a,代表 append (附加) 的意思,每次執行程式時,Logging 會將新的訊息加在舊的訊息後面,不會覆蓋舊的訊息。若要改成新訊息覆蓋就訊息,那可以將 filemode 參數設為 w,代表 write 的意思。
儲存log也輸出到console
logging有4個主要module:
- Logger:暴露了應用程式程式碼能直接使用的介面。
- Handler:將(記錄器產生的)日誌記錄傳送至合適的目的地。
- Filter:提供了更好的粒度控制,它可以決定輸出哪些日誌記錄。
- Formatter:指明瞭最終輸出中日誌記錄的佈局。
Handler
其中Handlers有以下幾類:
logging.StreamHandler-> 控制檯輸出 使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何檔案物件(file object)輸出資訊。 它的建構函式是:StreamHandler([strm])其中strm引數是一個檔案物件。預設是sys.stderr。logging.FileHandler-> 檔案輸出 和StreamHandler類似,用於向一個檔案輸出日誌資訊。不過FileHandler會幫你開啟這個檔案。 它的建構函式是:FileHandler(filename[,mode])filename是檔名,必須指定一個檔名。mode是檔案的開啟方式。預設是'a',即新增到檔案末端。logging.handlers.RotatingFileHandler-> 按照大小自動分割日誌檔案,一旦達到指定的大小重新生成檔案 這個Handler類似於上面的FileHandler,但是它可以管理檔案大小。當檔案達到一定大小之後,它會自動將當前日誌檔案改名,然後建立一個新的同名日誌檔案繼續輸出。比如日誌檔案是chat.log。當chat.log達到指定的大小之後,RotatingFileHandler自動把 檔案改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重新命名為chat.log.2。 最後重新建立 chat.log,繼續輸出日誌資訊。它的建構函式是:RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]),其中filename和mode兩個引數和FileHandler一樣。maxBytes用於指定日誌檔案的最大檔案大小。如果maxBytes為0,意味著日誌檔案可以無限大,這時上面描述的重新命名過程就不會發生。backupCount用於指定保留的備份檔案的個數。比如,如果指定為2,當上面描述的重新命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。logging.handlers.TimedRotatingFileHandler-> 按照時間自動分割日誌檔案 這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷檔案大小來決定何時重新建立日誌檔案,而是間隔一定時間就自動建立新的日誌檔案。重新命名的過程與RotatingFileHandler類似,不過新的檔案不是附加數字,而是當前時間。它的建構函式是:TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]),其中filename引數和backupCount引數和RotatingFileHandler具有相同的意義。interval是時間間隔。when引數是一個字串。表示時間間隔的單位,不區分大小寫。它有以下取值: S 秒 M 分 H 小時 D 天 W 每星期(interval==0時代表星期一) midnight 每天凌晨。
Formatters
Formatters預設的時間格式為%Y-%m-%d %H:%M:%S
Example
新增2個handler,一個輸出到螢幕上,一個寫到檔案裡。寫到檔案裡的那個handler必須是logging.handlers.RotatingFileHandler,超過1MB時會自動分割。
import logging
import logging.handlers
logger = logging.getLogger(filename) # filename就是你要存log的檔名
shell_print = logging.StreamHandler() # 往螢幕上輸出
shell_print.setFormatter(format_str) # 設定螢幕上顯示的格式
file_print = logging.handlers.RotatingFileHandler(
filename=filename,
mode='a',
maxBytes=1024*1024,
backupCount=backCount,
encoding='utf-8')
file_print.setFormatter(format_str) # 設定檔案裡寫入的格式
logger.addHandler(sh) # 把物件加到logger裡
logger.addHandler(th)
參考: