作者:小張學Python 本文鏈接: https://mp.weixin.qq.com/s/dkNkEohPl6H2VopUrpxxZg 轉載請注明來源!!
前言
在做項目的時候一直在用Python自帶的模塊logging,進行日志的記錄,雖然他們滿足我大部分的要求,但是還是有很多缺點,例如需要額外的配置、不能自動刪除時間久的日志文件等等。
難道真的沒有比較好的第三方模塊嗎。。。。。於是我在網上langlanglang.....咦?還真到了一個比較好的模塊來記錄日志。他就是今天我們的主角---loguru!!
一、安裝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) is False: 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{time}.log'),rotation="500 MB",level="WARNING",encoding='utf-8')
通過這樣的配置我們就可以實現每 500MB 存儲一個文件,每個 log 文件過大就會新創建一個 log 文件。
我們在配置 log 名字時加上了一個 time 占位符,這樣在生成時可以自動將時間替換進去,生成一個文件名包含時間的 log 文件。
另外我們也可以使用 rotation 參數實現定時創建 log 文件,例如:
logger.add('runtime_{time}.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) is False: 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 def func(): print(a) func() logger.warning("程序走到這里了")
error.log日志文件如下:
2020-09-24 16:50:58.398 | ERROR | __main__:<module>:17 - An error has been caught in function '<module>', process 'MainProcess' (42920), thread 'MainThread' (42252): Traceback (most recent call last): > File "D:/project/loguru_demo.py", line 17, in <module> func() └ <function func at 0x00000261BF734268> File "D:/project/loguru_demo.py", line 15, in func print(a) NameError: name 'a' is not defined 2020-09-24 16:50:58.792 | WARNING | __main__:<module>:18 - 程序走到這里了
很明顯,程序的報錯位置追蹤到了,也沒有影響程序接下來的正常運行。
四、結語
到這之后呢,已將loguru記錄日志的方法已經基本介紹完畢,具體詳細的課查看官方網站==>>官方文檔: