Python logging 日誌用法與範例

本篇將介紹 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
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

輸出如下,可以發現logging.debug()logging.info()的訊息都沒有出現,

1
2
3
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

根據上面的範例進行修改,
將 log level 修改成 DEBUG,讓 DEBUG level 與 INFO level 的 log 都顯示出來。

python-logging.py
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
5
DEBUG: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'表示為覆寫模式,之前的檔案會被覆蓋過去,預設是添加模式,會將內容接在上次檔案的尾端繼續寫入,

python-logging2.py
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檔內容如下:

log.txt
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 的檔名依照日期時間來命名,

python-logging3.py
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檔內容如下:

2020-04-14_21_34_59.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

python-logging4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
import datetime

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
'[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] %(message)s',
datefmt='%Y%m%d %H:%M:%S')

ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

log_filename = datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S.log")
fh = logging.FileHandler(log_filename)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

logger.addHandler(ch)
logger.addHandler(fh)

if __name__ == "__main__":
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

結果如先前一樣。

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 多媒體控制播放的網頁