loguru 日志庫快速入門

1.loguru

1.1 loguru 介紹

? ? loguru是一個(gè)功能強(qiáng)大且非常容易使用的第三方開源Python日志管理庫。它建立在Python標(biāo)準(zhǔn)庫中的logging模塊之上,并提供了更加簡潔直觀、功能豐富的接口。github倉庫地址:https://github.com/Delgan/loguru

1.2 安裝

? ? 想要快速體驗(yàn)其功能,首先需要安裝該庫,安裝命令如下所示:

$ pip install loguru

1.3 基本用法

? ? 在安裝完成,我們就可以來快速體驗(yàn)其功能了,如下所示:

1.3.1 快速使用

from loguru import logger

logger.info("這是一條INFO信息")
logger.debug("這是一條DEBUG信息")
logger.warning("這是一條WARNING信息")
logger.error("這是一條ERROR信息")
logger.critical("這是一條CRITICAL信息")

? ? 輸出結(jié)果如下所示:

01-快速使用演示.png

? ? loguru 日志輸出默認(rèn)格式如下:

  • 時(shí)間戳:日志記錄的具體時(shí)間,格式通常為年-月-日 時(shí):分:秒.毫秒
  • 日志級(jí)別:當(dāng)前這條日志的嚴(yán)重性級(jí)別
  • 模塊名稱:表示日志來自哪個(gè)模塊
  • 函數(shù)或作用域范圍:表示日志來自哪個(gè)函數(shù)或作用域范圍
  • 行號(hào):觸發(fā)日志所在的行號(hào)
  • 日志消息:實(shí)際的日志內(nèi)容

? ? 每條日志被特定的分隔符分隔并顯示,默認(rèn)分隔符為 |。同時(shí)loguru 也支持 使用顏色 來區(qū)分不同的日志級(jí)別,使得日志輸出更加直觀。如果默認(rèn)功能不能滿足需求,也可以進(jìn)行自定義。

? ? loguru 默認(rèn)會(huì)將日志輸出到 standard error stream (stderr),loguru這樣做是為了把日志輸出與你的應(yīng)用程序日志分開。如果需要更復(fù)雜的日志配置,你也可以自定義配置,例如將日志存儲(chǔ)到文件、發(fā)送到網(wǎng)絡(luò)服務(wù)中等。

1.3.2 日志級(jí)別

1.3.2.1 日志級(jí)別介紹

? ? 通過前面的快速使用,相信你已經(jīng)對(duì)loguru有了一個(gè)基本的了解。為了更好的根據(jù)日志級(jí)別進(jìn)行分類,loguru 根據(jù)其日志的重要性,定義了日志級(jí)別分類。如下所示:

級(jí)別 方法 數(shù)值 目的
TRACE logger.trace() 5 最詳細(xì)的日志記錄,常用于追蹤代碼執(zhí)行過程
DEBUG logger.debug() 10 用于記錄詳細(xì)的程序調(diào)試信息,一般用于開發(fā)階段
INFO logger.info() 20 用于記錄常規(guī)消息記錄
SUCCESS logger.success() 25 用于記錄一些操作成功的消息記錄
WARNING logger.warning() 30 用于記錄一些可能不是錯(cuò)誤,但需要關(guān)注的消息記錄
ERROR logger.error() 40 用于記錄錯(cuò)誤信息,這些錯(cuò)誤可能會(huì)影響程序某些功能,但不會(huì)導(dǎo)致出現(xiàn)崩潰或停止運(yùn)行
CRITICAL logger.critical() 50 用于記錄非常嚴(yán)重的錯(cuò)誤信息,這些錯(cuò)誤通常會(huì)導(dǎo)致程序出現(xiàn)崩潰或停止運(yùn)行

1.3.2.2 調(diào)整日志級(jí)別

? ? 默認(rèn)情況下,loguru的日志級(jí)別為DEBUG(10) 因此loguru會(huì)記錄并顯示日志級(jí)別為DEBUG及以上級(jí)別的消息記錄。這也就意味著,在你第一次使用loguru打印日志時(shí),會(huì)顯示除TRACE級(jí)別以外的所有日志信息。

? ? 如果想要開啟TRACE級(jí)別的日志記錄,可以自行調(diào)整最小日志級(jí)別,可以使用logger.add()方法,如下所示:

import sys
from loguru import logger

# 修改日志最小級(jí)別
logger.add(sys.stderr,level="TRACE")

logger.info("這是一條INFO信息")
logger.debug("這是一條DEBUG信息")
logger.warning("這是一條WARNING信息")
logger.error("這是一條ERROR信息")
logger.critical("這是一條CRITICAL信息")
logger.trace("這是一條TRACE信息")

? ? 輸出結(jié)果如下所示:

02-調(diào)整日志級(jí)別.png

? ? 通過上述代碼,我們導(dǎo)入了sys模塊并且將輸出重定向于sys.stderr。通過logger.add()方法添加了一個(gè)新的handler,這樣我們就成功修改了loguru默認(rèn)的日志級(jí)別,并將日志輸出到sys.stderr中。

? ? 通過調(diào)用loggeer.add()方法之后,會(huì)返回一個(gè)唯一值(handler_id),用于標(biāo)識(shí)handler。后面我們可以調(diào)用方法logger.remove(handler_id)來移除handler。示例如下所示:

import sys
from loguru import logger

def print_log():
    logger.info("~~"*30)
    logger.info("這是一條INFO信息")
    logger.debug("這是一條DEBUG信息")
    logger.warning("這是一條WARNING信息")
    logger.error("這是一條ERROR信息")
    logger.critical("這是一條CRITICAL信息")
    logger.trace("這是一條TRACE信息")

if __name__ == '__main__':
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,level="TRACE")
    logger.info(f"handler id:{handler_id}")
    print_log()
    logger.remove(handler_id)
    print_log()

? ? 輸出結(jié)果如下所示:

03-刪除自定義日志handler.png

? ? 調(diào)用logger.remove()方法時(shí),如果不傳入?yún)?shù)值,則默認(rèn)刪除所有已經(jīng)存在的handler,并且包含默認(rèn)的handler。通過這個(gè)方法,我們就可以實(shí)現(xiàn)在創(chuàng)建新的handler之前,刪除所有已經(jīng)存在的handler。

loguru中默認(rèn)的handler_id為0,如果需要?jiǎng)h除默認(rèn)的handler,在調(diào)用logger.remove()中傳入0即可。如果需要?jiǎng)h除其他新增的handler,為避免出現(xiàn)不是期望的結(jié)果,建議傳入明確的handler_id值。

? ? 在理解了loguru的日志級(jí)別之后,我們就可以根據(jù)需要選擇合適的日志級(jí)別策略。例如在開發(fā)環(huán)境中,可以使用DEBUG級(jí)別,在生產(chǎn)環(huán)境中,可以使用WARNING或以上的日志級(jí)別。

1.3.3 自定義日志

1.3.3.1 日志參數(shù)

? ? 在loguru中,add函數(shù)用于添加日志處理器。這個(gè)函數(shù)用于指定日志消息應(yīng)該被發(fā)送到何處,例如控制臺(tái)、文件或其他自定義的目的地。其定義如下所示:

def add(
    self,
    sink: Union[TextIO, Writable, Callable[[Message], None], Handler],
    *,
    level: Union[str, int] = ...,
    format: Union[str, FormatFunction] = ...,
    filter: Optional[Union[str, FilterFunction, FilterDict]] = ...,
    colorize: Optional[bool] = ...,
    serialize: bool = ...,
    backtrace: bool = ...,
    diagnose: bool = ...,
    enqueue: bool = ...,
    context: Optional[Union[str, BaseContext]] = ...,
    catch: bool = ...
) -> int: ...

? ? add函數(shù)主要參數(shù)介紹如下:

  • sink: 定義日志消息的輸出位置,可以是文件路徑、標(biāo)準(zhǔn)輸出(stdout)、標(biāo)準(zhǔn)錯(cuò)誤(stderr,默認(rèn))或其他自定義的輸出位置。
  • format: 指定日志消息的格式,可以是簡單的字符串,也可以是格式化字符串,支持各種字段插值。
  • level: 設(shè)置處理程序處理的日志消息的最低級(jí)別。比如設(shè)置為DEBUG,則處理程序?qū)⑻幚鞤EBUG以上所有級(jí)別的日志消息。
  • filter: 可選參數(shù),用于添加過濾器,根據(jù)特定的條件過濾掉不需要的日志消息。
  • colorize: 布爾值,指定是否對(duì)日志消息進(jìn)行著色處理,使日志在控制臺(tái)中更易于區(qū)分。
  • serialize: 布爾值,指定是否對(duì)日志消息進(jìn)行序列化處理,通常與enqueue=True一起使用,以確保多線程安全。
  • enqueue: 布爾值,指定是否將日志消息放入隊(duì)列中處理,用于多線程應(yīng)用中避免阻塞。
  • backtrace: 布爾值或字符串,指定是否記錄回溯信息,默認(rèn)為False。
  • diagnose: 布爾值,啟用后,會(huì)在處理程序內(nèi)部出現(xiàn)錯(cuò)誤時(shí)記錄診斷信息。
  • rotation: 日志文件輪換的配置,支持按大小或時(shí)間進(jìn)行日志文件的輪換。
  • retention: 用于設(shè)置日志文件的保留時(shí)間。
  • compression: 布爾值,指定是否對(duì)輪換后的日志文件進(jìn)行壓縮處理。

1.3.3.2 開發(fā)實(shí)踐

? ? loguru 默認(rèn)的配置已經(jīng)適用于大部分場景了,但也會(huì)有一些場景需要自定義日志的場景,我們可能過logger.add()方法來實(shí)現(xiàn)。

1.3.3.2.1 自定義format

? ? 通過format可以自定義想要輸出的內(nèi)容,而不必輸出其他額外的信息,示例如下所示:

import sys
from loguru import logger

def print_log():
    logger.info("~~"*30)
    logger.info("這是一條INFO信息")
    logger.debug("這是一條DEBUG信息")
    logger.warning("這是一條WARNING信息")
    logger.error("這是一條ERROR信息")
    logger.critical("這是一條CRITICAL信息")
    logger.trace("這是一條TRACE信息")

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,level="INFO",format="{message}")
    logger.info(f"handler id:{handler_id}")
    print_log()
    logger.remove(handler_id)

? ? 輸出結(jié)果如下所示:

handler id:1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這是一條INFO信息
這是一條WARNING信息
這是一條ERROR信息
這是一條CRITICAL信息

? ? 在上述代碼中,使用{message}占位符來表示要輸出的日志消息。這樣我們就得到了一個(gè)最小日志輸出記錄,而無其他額外日志記錄,例如時(shí)間戳、日志級(jí)別、來源等信息。format還支持以下占位符:

  • {time}: 時(shí)間戳
  • {level}: 日志級(jí)別
  • {message}: 實(shí)際的日志消息
  • {name}: Module 名稱
  • {line}: 行號(hào)

更多占位符的文檔可查看官網(wǎng)文檔:https://loguru.readthedocs.io/en/stable/api/logger.html#record

? ? 在日常使用,為了更好的進(jìn)行問題定位和分析日志,在日志記錄中,至少包含時(shí)間戳、日志級(jí)別日志內(nèi)容這三項(xiàng)。示例如下所示:

import sys
from loguru import logger

def print_log():
    logger.info("~~"*30)
    logger.info("這是一條INFO信息")
    logger.debug("這是一條DEBUG信息")
    logger.warning("這是一條WARNING信息")
    logger.error("這是一條ERROR信息")
    logger.critical("這是一條CRITICAL信息")
    logger.trace("這是一條TRACE信息")

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,
                        level="INFO",
                        format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}"
                    )
    logger.info(f"handler id:{handler_id}")
    print_log()

? ? 輸出結(jié)果如下所示:

2025-09-27 18:29:40 | INFO | handler id:1
2025-09-27 18:29:40 | INFO | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2025-09-27 18:29:40 | INFO | 這是一條INFO信息
2025-09-27 18:29:40 | WARNING | 這是一條WARNING信息
2025-09-27 18:29:40 | ERROR | 這是一條ERROR信息
2025-09-27 18:29:40 | CRITICAL | 這是一條CRITICAL信息

其中時(shí)間格式自定義可參考文檔: https://loguru.readthedocs.io/en/stable/api/logger.html

? ? loguru 也支持在format中使用顏色標(biāo)記符來自定義輸出的字符串顏色,例如<red>、<blue>等。這樣在終端中顯示日志消息,會(huì)自動(dòng)轉(zhuǎn)換對(duì)應(yīng)的顏色進(jìn)行顯示。示例如下所示:

import sys
from loguru import logger

def print_log():
    logger.info("~~"*30)
    logger.info("這是一條INFO信息")
    logger.debug("這是一條DEBUG信息")
    logger.warning("這是一條WARNING信息")
    logger.error("這是一條ERROR信息")
    logger.critical("這是一條CRITICAL信息")
    logger.trace("這是一條TRACE信息")

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,
                        level="INFO",
                        format="<red><b>{time:YYYY-MM-DD HH:mm:ss}</b></red> | <blue>{name}:{line}</blue> | <green>{level}</green> | <yellow><b> {message} </b></yellow>"
                    )
    logger.info(f"handler id:{handler_id}")
    print_log()

? ? 輸出結(jié)果如下所示:

04-自家義format顏色.png
1.3.3.2.2 添加日志上下文

? ? 在一部分場景中,我們可以添加一些額外的上下文信息,來幫助更好理解在記錄日志時(shí)發(fā)生了什么事情。loguru也提供幾種方式來添加上下文信息。其中最簡單常見的方式,就是通過關(guān)鍵字參數(shù)來傳值。示例如下所示:

import sys
from loguru import logger

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,
                        level="INFO",
                        format="{time:YYYY-MM-DD HH:mm:ss}| {level} | {message} | {extra}"
                    )
    logger.warning(f"日志級(jí)別為警告級(jí)別", log_level="WARNING")
    logger.info(f"handler id:",handler_id=handler_id)

? ? 輸出結(jié)果如下所示:

2025-09-27 18:55:58| WARNING | 日志級(jí)別為警告級(jí)別 | {'log_level': 'WARNING'}
2025-09-27 18:55:58| INFO | handler id: | {'handler_id': 1}

? ? 上述通過占位符{extra}為日志添加了一個(gè)上下文信息,適合于一次性添加的場景,loguru 還提供了以下兩個(gè)方法,來適用更多的場景:

  • bind(): 可以在所有handler實(shí)例上面添加額外的上下文信息,屬于永久性添加
  • contextualize(): 添加臨時(shí)性的上下文信息

? ? bind()方法非常適合于在所有的logger實(shí)例中添加額外的上下文信息。例如,在所有l(wèi)ogger實(shí)例上添加諸如userId、sessionIdt。這種操作將大量節(jié)省在所有l(wèi)ogger上手動(dòng)添加額外上下文信息。示例代碼如下所示:

import sys
from loguru import logger

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,
                        level="INFO",
                        format="{time:YYYY-MM-DD HH:mm:ss}| {level} | {message} | {extra}"
                    )
    user_logger=logger.bind(username="Surpass",user_id=999,session_id=8888)
    user_logger.info("I am Supass")
    user_logger.warning("loguru user logger.bind()")

? ? 輸出結(jié)果如下所示:

2025-09-27 19:09:50| INFO | I am Supass | {'username': 'Surpass', 'user_id': 999, 'session_id': 8888}
2025-09-27 19:09:50| WARNING | loguru user logger.bind() | {'username': 'Surpass', 'user_id': 999, 'session_id': 8888}

? ? contextualize()提供了一種非常干凈的方式來添加一個(gè)臨時(shí)的上下文信息,而且在操作完成后還會(huì)自動(dòng)清理,示例代碼如下所示:

import sys
from loguru import logger

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add(sys.stderr,
                        level="INFO",
                        format="{time:YYYY-MM-DD HH:mm:ss}| {level} | {message} | {extra}"
                    )
    with logger.contextualize(username="Surpass",user_id=999,session_id=8888):
        logger.info("Add temporarily context with contextualize")

    logger.warning("Hello Surpass",without_contextualize=True)

? ? 在上述示例中,contextualize()事實(shí)上使用了Python的上下文管理器來臨時(shí)添加額外的上下文信息,在with塊里面,所有日志消息都會(huì)被添加額外的上下文信息,而一旦退出with塊,則額外的上下文信息則會(huì)移除。

? ? 輸出結(jié)果如下所示:

2025-09-27 19:16:55| INFO | Add temporarily context with contextualize | {'username': 'Surpass', 'user_id': 999, 'session_id': 8888}
2025-09-27 19:16:55| WARNING | Hello Surpass | {'without_contextualize': True}
1.3.3.2.3 保存日志到文件

? ? 將日志輸出到終端在開發(fā)階段非常有用,而在生產(chǎn)環(huán)境中,日志需要保存到文件中,供日后的問題定位和日志分析。loguru 允許將日志保存至文件,并設(shè)置日志切割日志保留期限策略。

  • Log rotation: 即日志切割,它通常決定在什么時(shí)候開啟一個(gè)新的文件用于記錄日志,可以由日志文件大小、時(shí)間間隔、其他條件等決定。支持以下幾種方式的定義:
    ? 文件大小: 當(dāng)文件大小達(dá)到設(shè)定的大小后,創(chuàng)建新的日志文件,可以取的值有:100 MB、2 GB
    ? 時(shí)間: 即達(dá)到指定的時(shí)間就創(chuàng)建新的日志文件,可以取的值有:12:00
    ? 時(shí)間間隔:即達(dá)到指定的時(shí)間間隔之后,就創(chuàng)建新的日志文件,可以取的值有: 12 hours、3 days

  • Log retention: 即日志保留期限,它通常決定何時(shí)刪除舊的日志文件,可以由基于數(shù)量基于時(shí)間來決定。支持以下幾種方式的定義:
    ? 基于數(shù)量: 即僅保留最近n個(gè)文件,如果設(shè)置為3,則表示僅保留最近3個(gè)日志文件,其他日志文件則刪除
    ? 基于時(shí)間:即僅保留最近設(shè)定時(shí)間的文件,如果設(shè)置為"1 week",則表示僅保留最近1雕的日志文件,其他日志文件則刪除

from loguru import logger

if __name__ == '__main__':
    logger.remove()
    # 修改日志最小級(jí)別
    handler_id=logger.add("app.log",
                        level="INFO",
                        format="{time:YYYY-MM-DD HH:mm:ss}| {level} | {message} | {extra}",
                        rotation="1 KB", # 即日志文件達(dá)到1KB,就創(chuàng)建一個(gè)新日志文件
                        retention="1d"   # 即日志文件僅保留當(dāng)天,其他則要?jiǎng)h除
                    )
    with logger.contextualize(username="Surpass",user_id=999,session_id=8888):
        logger.info("Add temporarily context with contextualize")

    logger.warning("Hello Surpass",without_contextualize=True)
1.3.3.2.4 錯(cuò)誤處理和使用Loguru調(diào)試

? ? 當(dāng)我們?cè)谡{(diào)試程序時(shí),僅僅從日志中得知程序運(yùn)行出現(xiàn)錯(cuò)誤信息是不夠的。我們需要知道錯(cuò)誤是什么時(shí)候產(chǎn)生和為什么會(huì)產(chǎn)生錯(cuò)誤等。loguru 提供了一個(gè)非常強(qiáng)大的功能來輔助查看詳細(xì)的日志信息,例如錯(cuò)誤信息、變量信息、上下文信息等。

  • 使用裝飾器@logger.catch

? ? 最簡單抓取錯(cuò)誤日志信息的方式就是使用裝飾器@logger.catch。示例如下所示:

import sys
from loguru import logger

@logger.catch
def divide(a:int,b:int)->int:
    return a/b

if __name__ == '__main__':
    divide(10,0)

? ? 上述代碼在運(yùn)行會(huì)出現(xiàn)報(bào)錯(cuò),loguru產(chǎn)生的日志如下所示:

2025-09-27 20:06:45.140 | ERROR    | __main__:<module>:10 - An error has been caught in function '<module>', process 'MainProcess' (4288), thread 'MainThread' (24912):
Traceback (most recent call last):

> File "C:\Users\Surpass\Documents\PyCharmProjects\TestNote\test-note\loguru-demo\main.py", line 10, in <module>
    divide(10,0)
    └ <function divide at 0x000001EE6B0C8860>

  File "C:\Users\Surpass\Documents\PyCharmProjects\TestNote\test-note\loguru-demo\main.py", line 6, in divide
    return a/b
           │ └ 0
           └ 10

ZeroDivisionError: division by zero
  • 使用裝飾器@logger.catch并添加其他額外信息

? ? 使用基本裝飾器@logger.catch可以做到不需要任何配置就能自動(dòng)捕捉錯(cuò)誤信息,但在一些大型工程中,我們通常需要自行處理和控制輸出的錯(cuò)誤信息,這個(gè)時(shí)候就需要能夠自定義一些錯(cuò)誤信息、日志級(jí)別、處理特定類型的錯(cuò)誤。這個(gè)時(shí)候我們依然可以使用裝飾器@logger.catch,并傳遞額外的參數(shù)即可。示例如下所示:

import sys
from loguru import logger

@logger.catch(message="database connection failed",level="ERROR")
def connect_to_db(addr:str,port:int):
    if port < 1000:
        raise ValueError("Port must be greater than 1000")
    # 模擬連接數(shù)據(jù)庫錯(cuò)誤
    raise Exception("Connection to database failed")

if __name__ == '__main__':
    connect_to_db("127.0.0.1",123)

? ? 輸出結(jié)果如下所示:

2025-09-27 20:18:06.998 | ERROR    | __main__:<module>:12 - database connection failed
Traceback (most recent call last):

> File "C:\Users\Surpass\Documents\PyCharmProjects\TestNote\test-note\loguru-demo\main.py", line 12, in <module>
    connect_to_db("127.0.0.1",123)
    └ <function connect_to_db at 0x00000249B8400400>

  File "C:\Users\Surpass\Documents\PyCharmProjects\TestNote\test-note\loguru-demo\main.py", line 7, in connect_to_db
    raise ValueError("Port must be greater than 1000")

ValueError: Port must be greater than 1000
1.3.3.2.5 文件和控制臺(tái)同時(shí)輸出日志

? ? 在前面的示例中,日志要么輸出到文件,要么輸出到控制臺(tái),現(xiàn)在想同時(shí)輸出到文件和控制中,該如何操作了,示例代碼如下所示:

import sys
from loguru import logger

format="<green>{time:YYYY-MM-DD HH:mm:ss ZZ}</green> | <red><b>{level}</b></red> | <blue>{message}</blue> | {extra}"
level="DEBUG"

config={
    "handlers": [
        {"sink":sys.stdout,"format":format,"level":level},
        {"sink":"app.log", "format":format,"level":level}
    ],
    "extra": {"name":"Surpass"}
}

logger.configure(**config)

logger.info(logger.level(level))
logger.info("I am Surpass",level="INFO",age=28)
logger.warning("Test Warning",level="WARNING")
logger.debug("Test Debug",level="DEBUG")
logger.error("Test Error",level="ERROR")

? ? 輸出結(jié)果如下所示:

2025-09-27 21:28:22 +0800 | INFO | Level(name='DEBUG', no=10, color='<blue><bold>', icon='??') | {'name': 'Surpass'}
2025-09-27 21:28:22 +0800 | INFO | I am Surpass | {'name': 'Surpass', 'level': 'INFO', 'age': 28}
2025-09-27 21:28:22 +0800 | WARNING | Test Warning | {'name': 'Surpass', 'level': 'WARNING'}
2025-09-27 21:28:22 +0800 | DEBUG | Test Debug | {'name': 'Surpass', 'level': 'DEBUG'}
2025-09-27 21:28:22 +0800 | ERROR | Test Error | {'name': 'Surpass', 'level': 'ERROR'}

2.參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容