本篇將介紹 Python 內建的 logging 用法與範例,Python 的 logging 可以將 log 輸出到 console 與輸出到日誌檔裡,接下來就開始本篇的 Python logging 教學吧。
Python logging 的 log level 有五種等級,分別為DEBUG、INFO、WARNING、ERROR、CRITICAL,預設 log level 等級是 WARNING。
log level 等級與分別對應的 api 如下:
DEBUG:logging.debug()
INFO:logging.info()
WARNING:logging.warning()
ERROR:logging.error()
CRITICAL:logging.critical()
範例. 簡單的基本 logging
Python logging 基本用法與範例如下,預設的 log level 是 WARNING,代表大於或等於 WARNING 以上的 log 才會記錄(WARNING、ERROR、CRITICAL),不會記錄 DEBUG 與 INFO,
Python 的 logging 如果沒有設定 log filename 檔名的話就不會將日誌紀錄在檔案裡只會輸出顯示在 console 上,預設是沒有設定日誌檔名,
1 | #!/usr/bin/env python3 |
輸出如下,可以發現logging.debug()
與logging.info()
的訊息都沒有出現,1
2
3WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
根據上面的範例進行修改,
將 log level 修改成 DEBUG,讓 DEBUG level 與 INFO level 的 log 都顯示出來。1
2
3
4
5
6
7
8
9
10#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
輸出:1
2
3
4
5DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
範例. 進階的日誌使用方式
以下範例為實際上使用情形,使用 logging.basicConfig 來設定,設定時可以指定 log level 這樣 debug info 就可以顯示出來了,設定 log 的 filename 後只會輸出到檔案不會輸出在 console,filemode='w'
表示為覆寫模式,之前的檔案會被覆蓋過去,預設是添加模式,會將內容接在上次檔案的尾端繼續寫入,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
logging.basicConfig(level=logging.INFO, filename='log.txt', filemode='w',
format='[%(asctime)s %(levelname)-8s] %(message)s',
datefmt='%Y%m%d %H:%M:%S',
)
if __name__ == "__main__":
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
輸出log檔內容如下:1
2
3
4[20200414 21:34:40 INFO ] info
[20200414 21:34:40 WARNING ] warning
[20200414 21:34:40 ERROR ] error
[20200414 21:34:40 CRITICAL] critical
範例. 簡潔的日誌風格
這邊示範簡潔的日誌的格式,將 level 縮短變成一個字母,format 裡還能指定 module 名稱與程式碼行數,
你也可以將 log 的檔名依照日期時間來命名,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
import datetime
log_filename = datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S.log")
logging.basicConfig(level=logging.INFO, filename=log_filename, filemode='w',
#format='[%(levelname).1s %(asctime)s] %(message)s',
format='[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(message)s',
datefmt='%Y%m%d %H:%M:%S',
)
if __name__ == "__main__":
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
輸出log檔內容如下:1
2
3
4[I 20200414 21:34:40 python-logging3:14] info
[W 20200414 21:34:40 python-logging3:15] warning
[E 20200414 21:34:40 python-logging3:16] error
[C 20200414 21:34:40 python-logging3:17] critical
範例. 同時輸出到 console 與日誌檔
使用 logging 如果想要同時輸出到 console 與日誌檔只能手動加一些程式碼去設定,
在 Python logging 套件的 basicConfig() 裡的原始碼可以發現 console(StreamHandler) 與 日誌檔(FileHandler) 這兩種功能只能擇一使用,
手動加一些程式碼同時輸出到 console 與日誌檔的範例如下,
先使用 StreamHandler 輸出到console,
再使用 FileHandler 輸出到日誌檔,
最後在添加這兩個 Handler
1 | #!/usr/bin/env python3 |
結果如先前一樣。
logging.basicConfig 常用參數
以下為 logging.basicConfig 常用的參數與說明,level
:顯示日誌的等級filename
:log 的檔名format
:log 的輸出格式datefmt
:輸出時間的格式filemode
:日誌開啟模式handlers
:與filename與stream不相容,無法同時使用stream
:與handlers不相容,無法同時使用style
:formatter 使用 % 還是 {} 還是 $
使用 logging.basicConfig 可以對 logging 進行設定外,也可以透過另一個 logging.fileConfig 的方式來對 logging 進行設定,logging.fileConfig 就是將 config 檔案裡的設定值讀取進來作設定,詳細使用請參考logging.config.fileConfig()與Configuration file format
logging format 常用輸出格式
以下為 logging format 常用輸出格式與說明,%(asctime)s
:日期時間%(filename)s
:模組檔名%(funcName)s
:函式名稱%(levelno)s
:行數%(levelname)s
:logging level%(levelno)s
:logging level 的數值%(message)s
:訊息%(module)s
:模組名稱
以上就是 Python logging 日誌用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
參考
Python 3 官方教學
https://docs.python.org/3/library/logging.html
[Python] logging 教學 – Max的程式語言筆記
https://stackoverflow.max-everyday.com/2017/10/python-logging/
Python - 日誌 (logging) 模組 | Titangene Blog
https://titangene.github.io/article/python-logging.html
小狐狸事務所: Python 學習筆記 : 日誌 (logging) 模組測試
http://yhhuang1966.blogspot.com/2018/04/python-logging_24.html
tornado/log.py at master · tornadoweb/tornado
https://github.com/tornadoweb/tornado/blob/master/tornado/log.py
Python logging同时输出到屏幕和文件 - 孤鸿的天空
https://xnathan.com/2017/03/09/logging-output-to-screen-and-file/
Python logging浅尝(将log同时输出到Console和日志文件)_小桔的博客-CSDN博客
https://blog.csdn.net/u010895119/article/details/79470443
其它相關文章推薦
Python 讀檔,讀取 txt 文字檔
Python 字串分割 split
Python 取代字元或取代字串 replace
Python 建立多執行緒 thread
Python OpenCV resize 圖片縮放
Python OpenCV 顯示camera攝影機串流影像
Python 快速建立簡單網頁伺服器 http websever
Python 建立簡單的 Tornado Web
[Python小專案] Tornado+PyAutoGUI 多媒體控制播放的網頁