python3中超級(jí)好用的日志模塊-loguru模塊使用詳解
一. 使用logging模塊時(shí)
用python寫(xiě)代碼時(shí),logging模塊最基本的幾行配置,如下:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')執(zhí)行結(jié)果如下:

二. loguru模塊的基礎(chǔ)使用
如果想更簡(jiǎn)潔,可用loguru庫(kù),python3安裝:pip3 install loguru。
loguru默認(rèn)的輸出格式是上面的內(nèi)容,有時(shí)間、級(jí)別、模塊名、行號(hào)以及日志信息,不需要手動(dòng)創(chuàng)建 logger,直接使用即可,另外其輸出還是彩色的,看起來(lái)會(huì)更加友好。
用法如下:
from loguru import logger
logger.debug('this is a debug message')
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')
logger.success('this is success message!')
logger.critical('this is critical message!')執(zhí)行結(jié)果如下:

不需要配置什么東西,直接引入一個(gè) logger,然后調(diào)用其 debug 方法即可。
如果想要輸出到文件,只需要:
from loguru import logger
logger.add('my_log.log')
logger.debug('this is a debug')運(yùn)行之后會(huì)發(fā)現(xiàn)目錄下 my_log.log 出現(xiàn)了剛剛控制臺(tái)輸出的 DEBUG 信息。上面只是基礎(chǔ)用法,更詳細(xì)的在下面
三. logurr詳細(xì)使用
比如支持輸出到多個(gè)文件,分級(jí)別分別輸出,過(guò)大創(chuàng)建新文件,過(guò)久自動(dòng)刪除等等。
3.1 add 方法的定義
def add(
self,
sink,
*,
level=_defaults.LOGURU_LEVEL,
format=_defaults.LOGURU_FORMAT,
filter=_defaults.LOGURU_FILTER,
colorize=_defaults.LOGURU_COLORIZE,
serialize=_defaults.LOGURU_SERIALIZE,
backtrace=_defaults.LOGURU_BACKTRACE,
diagnose=_defaults.LOGURU_DIAGNOSE,
enqueue=_defaults.LOGURU_ENQUEUE,
catch=_defaults.LOGURU_CATCH,
**kwargs
):
pass看看它的源代碼,它支持這么多的參數(shù),如 level、format、filter、color 等等,另外我們還注意到它有個(gè)非常重要的參數(shù) sink,我們看看官方文檔:,可以了解到通過(guò) sink 我們可以傳入多種不同的數(shù)據(jù)結(jié)構(gòu),匯總?cè)缦拢?/p>
- sink 可以傳入一個(gè) file 對(duì)象,例如 sys.stderr 或者 open(‘file.log’, ‘w’) 都可以。
- sink 可以直接傳入一個(gè) str 字符串或者 pathlib.Path 對(duì)象,其實(shí)就是代表文件路徑的,如果識(shí)別到是這種類(lèi)型,它會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)路徑的日志文件并將日志輸出進(jìn)去。
- sink 可以是一個(gè)方法,可以自行定義輸出實(shí)現(xiàn)。
- sink 可以是一個(gè) logging 模塊的 Handler,比如 FileHandler、StreamHandler 等等。
- sink 還可以是一個(gè)自定義的類(lèi),具體的實(shí)現(xiàn)規(guī)范可以參見(jiàn)官方文檔https://loguru.readthedocs.io/en/stable/api/logger.html#sink。
所以說(shuō),剛才我們所演示的輸出到文件,僅僅給它傳了一個(gè) str 字符串路徑,他就給我們創(chuàng)建了一個(gè)日志文件,就是這個(gè)原理。
3.2 基本參數(shù)
下面我們?cè)倭私庀滤钠渌麉?shù),例如 format、filter、level 等等。
其實(shí)它們的概念和格式和 logging 模塊都是基本一樣的了,例如這里使用 format、filter、level 來(lái)規(guī)定輸出的格式:
logger.add('runtime.log', format="{time} {level} {message}", filter="my_module", level="INFO")3.3 刪除 sink
另外添加 sink 之后我們也可以對(duì)其進(jìn)行刪除,相當(dāng)于重新刷新并寫(xiě)入新的內(nèi)容。
刪除的時(shí)候根據(jù)剛剛 add 方法返回的 id 進(jìn)行刪除即可,看下面的例子:
from loguru import logger
trace = logger.add('my_log.log')
logger.debug('this is a debug message')
logger.remove(trace)
logger.debug('this is another debug message')看這里,我們首先 add 了一個(gè) sink,然后獲取它的返回值,賦值為 trace。隨后輸出了一條日志,然后將 trace 變量傳給 remove 方法,再次輸出一條日志,看看結(jié)果是怎樣的。
控制臺(tái)輸出如下:

日志文件 my_log.log 內(nèi)容如下:

可以發(fā)現(xiàn),在調(diào)用 remove 方法之后,確實(shí)將歷史 log 刪除了。但實(shí)際上這并不是刪除,只不過(guò)是將 sink 對(duì)象移除之后,在這之前的內(nèi)容不會(huì)再輸出到日志中。
這樣我們就可以實(shí)現(xiàn)日志的刷新重新寫(xiě)入操作。
3.4 rotation 配置
用了 loguru 我們還可以非常方便地使用 rotation 配置,比如我們想一天輸出一個(gè)日志文件,或者文件太大了自動(dòng)分隔日志文件,我們可以直接使用 add 方法的 rotation 參數(shù)進(jìn)行配置。
我們看看下面的例子:
logger.add('runtime_{time}.log', rotation="500 MB")通過(guò)這樣的配置我們就可以實(shí)現(xiàn)每 500MB 存儲(chǔ)一個(gè)文件,每個(gè) log 文件過(guò)大就會(huì)新創(chuàng)建一個(gè) log 文件。我們?cè)谂渲?log 名字時(shí)加上了一個(gè) time 占位符,這樣在生成時(shí)可以自動(dòng)將時(shí)間替換進(jìn)去,生成一個(gè)文件名包含時(shí)間的 log 文件。
另外我們也可以使用 rotation 參數(shù)實(shí)現(xiàn)定時(shí)創(chuàng)建 log 文件,例如:
logger.add('runtime_{time}.log', rotation='00:00')這樣就可以實(shí)現(xiàn)每天 0 點(diǎn)新創(chuàng)建一個(gè) log 文件輸出了。
另外我們也可以配置 log 文件的循環(huán)時(shí)間,比如每隔一周創(chuàng)建一個(gè) log 文件,寫(xiě)法如下:
logger.add('runtime_{time}.log', rotation='1 week')這樣我們就可以實(shí)現(xiàn)一周創(chuàng)建一個(gè) log 文件了。
3.5 retention 配置
很多情況下,一些非常久遠(yuǎn)的 log 對(duì)我們來(lái)說(shuō)并沒(méi)有什么用處了,它白白占據(jù)了一些存儲(chǔ)空間,不清除掉就會(huì)非常浪費(fèi)。retention 這個(gè)參數(shù)可以配置日志的最長(zhǎng)保留時(shí)間。
比如我們想要設(shè)置日志文件最長(zhǎng)保留 10 天,可以這么來(lái)配置:
logger.add('runtime.log', retention='10 days')
這樣 log 文件里面就會(huì)保留最新 10 天的 log,媽媽再也不用擔(dān)心 log 沉積的問(wèn)題啦。
3.6 compression 配置
loguru 還可以配置文件的壓縮格式,比如使用 zip 文件格式保存,示例如下:
logger.add('runtime.log', compression='zip')這樣可以更加節(jié)省存儲(chǔ)空間。
3.7 字符串格式化
loguru 在輸出 log 的時(shí)候還提供了非常友好的字符串格式化功能,像這樣:
logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')這樣在添加參數(shù)就非常方便了。
3.8 Traceback 記錄
在很多情況下,如果遇到運(yùn)行錯(cuò)誤,而我們?cè)诖蛴≥敵?log 的時(shí)候萬(wàn)一不小心沒(méi)有配置好 Traceback 的輸出,很有可能我們就沒(méi)法追蹤錯(cuò)誤所在了。
但用了 loguru 之后,我們用它提供的裝飾器就可以直接進(jìn)行 Traceback 的記錄,類(lèi)似這樣的配置即可:
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)我們做個(gè)測(cè)試,我們?cè)谡{(diào)用時(shí)三個(gè)參數(shù)都傳入 0,直接引發(fā)除以 0 的錯(cuò)誤,看看會(huì)出現(xiàn)什么情況:
my_function(0, 0, 0)
運(yùn)行完畢之后,可以發(fā)現(xiàn) log 里面就出現(xiàn)了 Traceback 信息,而且給我們輸出了當(dāng)時(shí)的變量值,真的是不能再贊了!結(jié)果如下:
> File "run.py", line 15, in <module>
my_function(0, 0, 0)
└ <function my_function at 0x1171dd510>
File "/private/var/py/logurutest/demo5.py", line 13, in my_function
return 1 / (x + y + z)
│ │ └ 0
│ └ 0
└ 0
ZeroDivisionError: division by zero因此,用 loguru 可以非常方便地實(shí)現(xiàn)日志追蹤,debug 效率可能要高上十倍了?
另外 loguru 還有很多很多強(qiáng)大的功能,這里就不再一一展開(kāi)講解了,更多的內(nèi)容大家可以看看 loguru 的官方文檔詳細(xì)了解一下:https://loguru.readthedocs.io/en/stable/index.html。
看完之后,是時(shí)候把自己的 logging 模塊替換成 loguru 啦!
到此這篇關(guān)于python3中超級(jí)好用的日志模塊-loguru模塊使用詳解的文章就介紹到這了,更多相關(guān)python日志模塊loguru模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中性能分析利器pyinstrument詳細(xì)講解
大家好,本篇文章主要講的是Python中性能分析利器pyinstrument詳細(xì)講解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
Python?ConfigParser庫(kù)輕松讀寫(xiě)INI文件實(shí)例探究
這篇文章主要為大家介紹了Python?ConfigParser庫(kù)輕松讀寫(xiě)INI文件實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python用K-means聚類(lèi)算法進(jìn)行客戶分群的實(shí)現(xiàn)
這篇文章主要介紹了Python用K-means聚類(lèi)算法進(jìn)行客戶分群的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
搞定這套Python爬蟲(chóng)面試題(面試會(huì)so easy)
Python 是一門(mén)開(kāi)源的解釋性語(yǔ)言,相比 Java C++ 等語(yǔ)言,Python 具有動(dòng)態(tài)特性,非常靈活。這篇文章主要介紹了搞定這套Python爬蟲(chóng)面試題,面試會(huì)so easy,需要的朋友可以參考下2019-04-04

