在做專案的時候一直在用python自帶的模組logging,進行日誌的記錄,雖然他們滿足我大部分的要求,但是還是有很多缺點,例如需要額外的配置、不能自動刪除時間久的日誌檔案等等。
難道真的沒有比較好的第三方模組嗎。。。。。於是我在網上langlanglang…咦?還真到了乙個比較好的模組來記錄日誌。他就是今天我們的主角—loguru!!
pip install loguru
from loguru import loggerlogger.debug(
'this is a debug message'
)
執行結果如下:從結果可以得知,不需要配置什麼東西,然後呼叫其 debug方法即可。在 loguru 裡面有且僅有乙個主要物件,那就是 logger.loguru 裡面有且僅有乙個 logger,而且它已經被提前配置了一些基礎資訊,比如比較友好的格式化、文字顏色資訊等等。
既然是日誌,那麼最常見的就是輸出到檔案了。loguru 對輸出到檔案的配置有非常強大的支援,比如支援輸出到多個檔案,分級別分別輸出,過大建立新檔案,過久自動刪除等等。下面我們分別看看這些怎樣來實現,這裡基本上就是 add 方法的使用介紹。
1.輸出日誌到檔案,記錄日誌的等級,編碼格式
import os
from loguru import logger
# logger.debug('this is a debug message')
base_dir = os.path.dirname(os.path.abspath(__file__)
)# 日誌檔案配置
log_dir = os.path.join(base_dir,
'log'
)if os.path.exists(log_dir)
isfalse
: os.makedirs(log_dir)
logger.add(os.path.join(log_dir,
'error.log'
),encoding=
'utf-8'
,level=
"info"
)
2.rotation 配置用了 loguru 我們還可以非常方便地使用rotation 配置,比如我們想一天輸出乙個日誌檔案,或者檔案太大了自動分隔日誌檔案,我們可以直接使用 add 方法的 rotation 引數進行配置
#輸出到檔案"error2020-09-21_16-08-52_714738.log",
logger.add(os.path.join(log_dir,
'error.log'
),rotation=
"500 mb"
,level=
"warning"
,encoding=
'utf-8'
)
通過這樣的配置我們就可以實現每 500mb 儲存乙個檔案,每個 log 檔案過大就會新建立乙個 log 檔案。我們在配置 log 名字時加上了乙個 time 佔位符,這樣在生成時可以自動將時間替換進去,生成乙個檔名包含時間的 log 檔案。另外我們也可以使用 rotation 引數實現定時建立 log 檔案,例如:
logger.add(
'runtime_.log'
, rotation=
'00:00'
)#實現每天 0 點新建立乙個 log 檔案輸出了。
另外我們也可以配置 log 檔案的迴圈時間,比如每隔一周建立乙個 log 檔案,寫法如下:
logger.add(os.path.join(log_dir,
'error.log'
),rotation=
'1 week'
,encoding=
'utf-8'
)#實現 1 day 1 week 1 hour 即多久生成乙個新的檔案
3.retention 配置很多情況下,一些非常久遠的 log 對我們來說並沒有什麼用處了,它白白佔據了一些儲存空間,不清除掉就會非常浪費。retention 這個引數可以配置日誌的最長保留時間。
logger.add(os.path.join(log_dir,
'error.log'
),rotation=
'1 day'
,retention=
'30 days'
,encoding=
'utf-8'
)
這樣log 檔案裡面就會保留最新 30 天的, log會自動清理乙個月之前的日誌
4.compression 配置
loguru 還可以配置檔案的壓縮格式,這樣可以更加節省儲存空間,比如使用 zip 檔案格式儲存,示例如下:
logger.add(os.path.join(log_dir,
'error.log'
),rotation=
'1 day'
, compression=
'zip'
,retention=
'30 days'
,encoding=
'utf-8'
)
5.enqueue配置loguru可以配置在多程序同時往日誌檔案寫日誌的時候使用佇列達到非同步功效。
logger.add(os.path.join(log_dir,
'error.log'
), enqueue=
true
)# 非同步寫入
6.traceback 記錄在很多情況下,如果遇到執行錯誤,而我們在列印輸出 log 的時候萬一不小心沒有配置好 traceback 的輸出,很有可能我們就沒法追蹤錯誤所在了。
但用了 loguru 之後,我們用它提供的裝飾器就可以直接進行 traceback 的記錄,例如:
import os
from loguru import logger
# logger.debug('this is a debug message')
base_dir = os.path.dirname(os.path.abspath(__file__)
)# 日誌檔案配置
log_dir = os.path.join(base_dir,
'log'
)if os.path.exists(log_dir)
isfalse
: os.makedirs(log_dir)
logger.add(os.path.join(log_dir,
'error.log'
),rotation=
'1 day'
,retention=
'30 days'
,encoding=
'utf-8'
,level=
"info"
)@logger.catch
deffunc()
:print
(a)func(
)logger.warning(
"程式走到這裡了"
)
error.log日誌檔案如下:
2020-09
-2416:
50:58.398
| error | __main__:
:17- an error has been caught in function ''
, process 'mainprocess'
(42920
), thread 'mainthread'
(42252):
traceback (most recent call last)
:> file "d:/project/loguru_demo.py"
, line 17,in
func(
) └
>
file "d:/project/loguru_demo.py"
, line 15
,in func
print
(a)nameerror: name 'a'
isnot defined
2020-09
-2416:
50:58.792
| warning | __main__:
:18- 程式走到這裡了
很明顯,程式的報錯位置追蹤到了,也沒有影響程式接下來的正常執行。
到這之後呢,已將loguru記錄日誌的方法已經基本介紹完畢,具體詳細的課檢視官方**==>>官方文件:
作者:小張學python
logging模組日誌記錄
coding utf 8 import logging,os from time import strftime now strftime y m d.h.m.s.class log object def init self 檔案的命名 self.logname os.path.join os.pa...
c 日誌記錄模組
該模組從實際專案中產生,通過extern宣告的方式,可在 不同模組中生成日誌,日誌檔名稱為隨機碼加使用者指定名稱,採用隨機碼是為了避免日誌檔案可能被覆蓋的問題。願意的話你也能自己構建個人的日誌記錄模組,本次分享的模組實現方法比較簡單,可能有些地方沒考慮清楚。created by jerry on 2...
python日誌模組
logging.debug 10 logging.info 20 logging.warning 30 logging.error 40 logging.critical 50預設級別為warning 預設輸出位置為控制台 import logging logging.basicconfig 可用引...