日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

為什么不推薦使用Python原生日志庫?

來源: 責(zé)編: 時(shí)間:2023-11-06 17:19:10 279觀看
導(dǎo)讀包括我在內(nèi)的大多數(shù)人,當(dāng)編寫小型腳本時(shí),習(xí)慣使用print來debug,肥腸方便,這沒問題,但隨著代碼不斷完善,日志功能一定是不可或缺的,極大程度方便問題溯源以及甩鍋,也是每個(gè)工程師必備技能。Python自帶的logging我個(gè)人不推介使

包括我在內(nèi)的大多數(shù)人,當(dāng)編寫小型腳本時(shí),習(xí)慣使用print來debug,肥腸方便,這沒問題,但隨著代碼不斷完善,日志功能一定是不可或缺的,極大程度方便問題溯源以及甩鍋,也是每個(gè)工程師必備技能。YC328資訊網(wǎng)——每日最新資訊28at.com

Python自帶的logging我個(gè)人不推介使用,不太Pythonic,而開源的Loguru庫成為眾多工程師及項(xiàng)目中首選,本期將同時(shí)對(duì)logging及Loguru進(jìn)行使用對(duì)比,希望有所幫助。YC328資訊網(wǎng)——每日最新資訊28at.com

YC328資訊網(wǎng)——每日最新資訊28at.com

快速示例

在logging中,默認(rèn)的日志功能輸出的信息較為有限:YC328資訊網(wǎng)——每日最新資訊28at.com

import logginglogger = logging.getLogger(__name__)def main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")if __name__ == "__main__":    main()

輸出(logging默認(rèn)日志等級(jí)為warning,故此處未輸出info與debug等級(jí)的信息):YC328資訊網(wǎng)——每日最新資訊28at.com

WARNING:root:This is a warning messageERROR:root:This is an error message

再來看看loguru,默認(rèn)生成的信息就較為豐富了:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerdef main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")if __name__ == "__main__":    main()

YC328資訊網(wǎng)——每日最新資訊28at.com

提供了執(zhí)行時(shí)間、等級(jí)、在哪個(gè)函數(shù)調(diào)用、具體哪一行等信息。YC328資訊網(wǎng)——每日最新資訊28at.com

格式化日志

格式化日志允許我們向日志添加有用的信息,例如時(shí)間戳、日志級(jí)別、模塊名稱、函數(shù)名稱和行號(hào)。YC328資訊網(wǎng)——每日最新資訊28at.com

在logging中使用%達(dá)到格式化目的:YC328資訊網(wǎng)——每日最新資訊28at.com

import logging# Create a logger and set the logging levellogging.basicConfig(    level=logging.INFO,    format="%(asctime)s | %(levelname)s | %(module)s:%(funcName)s:%(lineno)d - %(message)s",    datefmt="%Y-%m-%d %H:%M:%S",)logger = logging.getLogger(__name__)def main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")

輸出:YC328資訊網(wǎng)——每日最新資訊28at.com

2023-10-18 15:47:30 | INFO | tmp:<module>:186 - This is an info message2023-10-18 15:47:30 | WARNING | tmp:<module>:187 - This is a warning message2023-10-18 15:47:30 | ERROR | tmp:<module>:188 - This is an error message

而loguru使用和f-string相同的{}格式,更方便:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerlogger.add(    sys.stdout,    level="INFO",    format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{function}:{line} - {message}",)

日志保存

在logging中,實(shí)現(xiàn)日志保存與日志打印需要兩個(gè)額外的類,F(xiàn)ileHandler 和 StreamHandler:YC328資訊網(wǎng)——每日最新資訊28at.com

import logginglogging.basicConfig(    level=logging.DEBUG,    format="%(asctime)s | %(levelname)s | %(module)s:%(funcName)s:%(lineno)d - %(message)s",    datefmt="%Y-%m-%d %H:%M:%S",    handlers=[        logging.FileHandler(filename="/your/save/path/info.log", level=logging.INFO),        logging.StreamHandler(level=logging.DEBUG),    ],)logger = logging.getLogger(__name__)def main():    logging.debug("This is a debug message")    logging.info("This is an info message")    logging.warning("This is a warning message")    logging.error("This is an error message")if __name__ == "__main__":    main()

但是在loguru中,只需要使用add方法即可達(dá)到目的:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerlogger.add(    'info.log',    format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{function}:{line} - {message}",    level="INFO",)def main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")if __name__ == "__main__":    main()

日志輪換

日志輪換指通過定期創(chuàng)建新的日志文件并歸檔或刪除舊的日志來防止日志變得過大。YC328資訊網(wǎng)——每日最新資訊28at.com

在logging中,需要一個(gè)名為 TimedRotatingFileHandler 的附加類,以下代碼示例代表每周切換到一個(gè)新的日志文件 ( when=“WO”, interval=1 ),并保留最多 4 周的日志文件 ( backupCount=4 ):YC328資訊網(wǎng)——每日最新資訊28at.com

import loggingfrom logging.handlers import TimedRotatingFileHandlerlogger = logging.getLogger(__name__)logger.setLevel(logging.DEBUG)# Create a formatter with the desired log formatformatter = logging.Formatter(    "%(asctime)s | %(levelname)-8s | %(module)s:%(funcName)s:%(lineno)d - %(message)s",    datefmt="%Y-%m-%d %H:%M:%S",)file_handler = TimedRotatingFileHandler(    filename="debug2.log", when="WO", interval=1, backupCount=4)file_handler.setLevel(logging.INFO)file_handler.setFormatter(formatter)logger.addHandler(file_handler)def main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")if __name__ == "__main__":    main()

在loguru中,可以通過將 rotation 和 retention 參數(shù)添加到 add 方法來達(dá)到目的,如下示例,同樣肥腸方便:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerlogger.add("debug.log", level="INFO", rotation="1 week", retention="4 weeks")def main():    logger.debug("This is a debug message")    logger.info("This is an info message")    logger.warning("This is a warning message")    logger.error("This is an error message")if __name__ == "__main__":    main()

日志篩選

日志篩選指根據(jù)特定條件有選擇的控制應(yīng)輸出與保存哪些日志信息。YC328資訊網(wǎng)——每日最新資訊28at.com

在logging中,實(shí)現(xiàn)該功能需要?jiǎng)?chuàng)建自定義日志過濾器類:YC328資訊網(wǎng)——每日最新資訊28at.com

import logginglogging.basicConfig(    filename="test.log",    format="%(asctime)s | %(levelname)-8s | %(module)s:%(funcName)s:%(lineno)d - %(message)s",    level=logging.INFO,)class CustomFilter(logging.Filter):    def filter(self, record):        return "Cai Xukong" in record.msg# Create a custom logging filtercustom_filter = CustomFilter()# Get the root logger and add the custom filter to itlogger = logging.getLogger()logger.addFilter(custom_filter)def main():    logger.info("Hello Cai Xukong")    logger.info("Bye Cai Xukong")if __name__ == "__main__":    main()

在loguru中,可以簡單地使用lambda函數(shù)來過濾日志:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerlogger.add("test.log", filter=lambda x: "Cai Xukong" in x["message"], level="INFO")def main():    logger.info("Hello Cai Xukong")    logger.info("Bye Cai Xukong")if __name__ == "__main__":    main()

捕獲異常

在logging中捕獲異常較為不便且難以調(diào)試,如:YC328資訊網(wǎng)——每日最新資訊28at.com

import logginglogging.basicConfig(    level=logging.DEBUG,    format="%(asctime)s | %(levelname)s | %(module)s:%(funcName)s:%(lineno)d - %(message)s",    datefmt="%Y-%m-%d %H:%M:%S",)def division(a, b):    return a / bdef nested(c):    try:        division(1, c)    except ZeroDivisionError:        logging.exception("ZeroDivisionError")if __name__ == "__main__":    nested(0)
Traceback (most recent call last):  File "logging_example.py", line 16, in nested    division(1, c)  File "logging_example.py", line 11, in division    return a / bZeroDivisionError: division by zero

上面輸出的信息未提供觸發(fā)異常的c值信息,而在loguru中,通過顯示包含變量值的完整堆棧跟蹤來方便用戶識(shí)別:YC328資訊網(wǎng)——每日最新資訊28at.com

Traceback (most recent call last):  File "logging_example.py", line 16, in nested    division(1, c)  File "logging_example.py", line 11, in division    return a / bZeroDivisionError: division by zero

YC328資訊網(wǎng)——每日最新資訊28at.com

值得一提的是,loguru中的catch裝飾器允許用戶捕獲函數(shù)內(nèi)任何錯(cuò)誤,且還會(huì)標(biāo)識(shí)發(fā)生錯(cuò)誤的線程:YC328資訊網(wǎng)——每日最新資訊28at.com

from loguru import loggerdef division(a, b):    return a / b@logger.catchdef nested(c):    division(1, c)if __name__ == "__main__":    nested(0)

YC328資訊網(wǎng)——每日最新資訊28at.com

OK,作為普通玩家以上功能足以滿足日常日志需求,通過對(duì)比logging與loguru應(yīng)該讓大家有了直觀感受,哦對(duì)了,loguru如何安裝?YC328資訊網(wǎng)——每日最新資訊28at.com

pip install loguru

以上就是本期的全部內(nèi)容,期待點(diǎn)贊在看,我是啥都生,下次再見。YC328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-17257-0.html為什么不推薦使用Python原生日志庫?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 如何將Docker的構(gòu)建時(shí)間減少40%

下一篇: Gorm 中的遷移指南

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版狂暴引擎2.0加持:超177萬跑分?jǐn)孬@性能第一

    Redmi的后性能時(shí)代戰(zhàn)略發(fā)布會(huì)今天下午如期舉辦,在本次發(fā)布會(huì)上,Redmi公布了多項(xiàng)關(guān)于和聯(lián)發(fā)科的深度合作,以及新機(jī)K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類下
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗(yàn)?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點(diǎn)贊!更瘋狂的是,這
  • 得物寵物生意「狂飆」,發(fā)力“它經(jīng)濟(jì)”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內(nèi)的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項(xiàng)。通過上傳自家寵物的部位細(xì)節(jié),就能收獲擁有專業(yè)資質(zhì)認(rèn)證的得物鑒
  • 國行版三星Galaxy Z Fold5/Z Flip5發(fā)布 售價(jià)7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發(fā)布會(huì),正式在國內(nèi)推出了新一代折疊屏智能手機(jī)三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 三星Galaxy Z Fold/Flip 5國行售價(jià)曝光 :最低7499元/12999元起

    據(jù)官方此前宣布,三星將于7月26日也就是明天在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 聯(lián)想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個(gè)平板

    ThinkBook Plus 是聯(lián)想的一個(gè)特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據(jù)有人爆料,聯(lián)想的下一款 ThinkBook Plus 可能更特殊,它
  • 電博會(huì)與軟博會(huì)實(shí)現(xiàn)"線下+云端"的雙線融合

    在本次“電博會(huì)”與“軟博會(huì)”雙展會(huì)利好條件的加持下,既可以發(fā)揮展會(huì)拉動(dòng)人流、信息流、資金流實(shí)現(xiàn)快速交互流動(dòng)的作用,繼而推動(dòng)區(qū)域經(jīng)濟(jì)良性發(fā)展;又可以聚
Top 主站蜘蛛池模板: 嘉善县| 福贡县| 焉耆| 缙云县| 永济市| 唐海县| 磐安县| 宣威市| 普定县| 禹城市| 保康县| 灵寿县| 获嘉县| 托克托县| 普定县| 通道| 辽宁省| 延川县| 襄垣县| 宿松县| 遂川县| 墨玉县| 桃园市| 合肥市| 翼城县| 利津县| 鹤峰县| 寿宁县| 贵港市| 潼关县| 灌阳县| 汕头市| 左权县| 石河子市| 荃湾区| 新密市| 乌兰浩特市| 亳州市| 葫芦岛市| 巴东县| 呼伦贝尔市|