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-02Python?ConfigParser庫(kù)輕松讀寫(xiě)INI文件實(shí)例探究
這篇文章主要為大家介紹了Python?ConfigParser庫(kù)輕松讀寫(xiě)INI文件實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python用K-means聚類(lèi)算法進(jìn)行客戶(hù)分群的實(shí)現(xiàn)
這篇文章主要介紹了Python用K-means聚類(lèi)算法進(jìn)行客戶(hù)分群的實(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