日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

python3中超級(jí)好用的日志模塊-loguru模塊使用詳解_python

作者:cui_yonghua ? 更新時(shí)間: 2022-12-22 編程語言

一. 使用logging模塊時(shí)

用python寫代碼時(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庫,python3安裝:pip3 install loguru。

loguru默認(rèn)的輸出格式是上面的內(nèi)容,有時(shí)間、級(jí)別、模塊名、行號(hào)以及日志信息,不需要手動(dòng)創(chuàng)建 logger,直接使用即可,另外其輸出還是彩色的,看起來會(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í)別分別輸出,過大創(chuàng)建新文件,過久自動(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,我們看看官方文檔:,可以了解到通過 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í)別到是這種類型,它會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)路徑的日志文件并將日志輸出進(jìn)去。
  • sink 可以是一個(gè)方法,可以自行定義輸出實(shí)現(xiàn)。
  • sink 可以是一個(gè) logging 模塊的 Handler,比如 FileHandler、StreamHandler 等等。
  • sink 還可以是一個(gè)自定義的類,具體的實(shí)現(xiàn)規(guī)范可以參見官方文檔https://loguru.readthedocs.io/en/stable/api/logger.html#sink。

所以說,剛才我們所演示的輸出到文件,僅僅給它傳了一個(gè) str 字符串路徑,他就給我們創(chuàng)建了一個(gè)日志文件,就是這個(gè)原理。

3.2 基本參數(shù)

下面我們?cè)倭私庀滤钠渌麉?shù),例如 format、filter、level 等等。

其實(shí)它們的概念和格式和 logging 模塊都是基本一樣的了,例如這里使用 format、filter、level 來規(guī)定輸出的格式:

logger.add('runtime.log', format="{time} {level} {message}", filter="my_module", level="INFO")

3.3 刪除 sink

另外添加 sink 之后我們也可以對(duì)其進(jìn)行刪除,相當(dāng)于重新刷新并寫入新的內(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í)際上這并不是刪除,只不過是將 sink 對(duì)象移除之后,在這之前的內(nèi)容不會(huì)再輸出到日志中。

這樣我們就可以實(shí)現(xiàn)日志的刷新重新寫入操作。

3.4 rotation 配置

用了 loguru 我們還可以非常方便地使用 rotation 配置,比如我們想一天輸出一個(gè)日志文件,或者文件太大了自動(dòng)分隔日志文件,我們可以直接使用 add 方法的 rotation 參數(shù)進(jìn)行配置。

我們看看下面的例子:

logger.add('runtime_{time}.log', rotation="500 MB")

通過這樣的配置我們就可以實(shí)現(xiàn)每 500MB 存儲(chǔ)一個(gè)文件,每個(gè) log 文件過大就會(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 文件,寫法如下:

logger.add('runtime_{time}.log', rotation='1 week')

這樣我們就可以實(shí)現(xiàn)一周創(chuàng)建一個(gè) log 文件了。

3.5 retention 配置

很多情況下,一些非常久遠(yuǎn)的 log 對(duì)我們來說并沒有什么用處了,它白白占據(jù)了一些存儲(chǔ)空間,不清除掉就會(huì)非常浪費(fèi)。retention 這個(gè)參數(shù)可以配置日志的最長(zhǎng)保留時(shí)間。

比如我們想要設(shè)置日志文件最長(zhǎng)保留 10 天,可以這么來配置:

logger.add('runtime.log', retention='10 days')

這樣 log 文件里面就會(huì)保留最新 10 天的 log,媽媽再也不用擔(dān)心 log 沉積的問題啦。

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í)候萬一不小心沒有配置好 Traceback 的輸出,很有可能我們就沒法追蹤錯(cuò)誤所在了。

但用了 loguru 之后,我們用它提供的裝飾器就可以直接進(jìn)行 Traceback 的記錄,類似這樣的配置即可:

@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)大的功能,這里就不再一一展開講解了,更多的內(nèi)容大家可以看看 loguru 的官方文檔詳細(xì)了解一下:https://loguru.readthedocs.io/en/stable/index.html。

看完之后,是時(shí)候把自己的 logging 模塊替換成 loguru 啦!

原文鏈接:https://cuiyonghua.blog.csdn.net/article/details/107498535

欄目分類
最近更新