精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 前端
Python自帶的logging我個人不推介使用,不太Pythonic,而開源的Loguru庫成為眾多工程師及項目中首選,本期將同時對logging及Loguru進行使用對比,希望有所幫助。

包括我在內的大多數人,當編寫小型腳本時,習慣使用print來debug,肥腸方便,這沒問題,但隨著代碼不斷完善,日志功能一定是不可或缺的,極大程度方便問題溯源以及甩鍋,也是每個工程師必備技能。

Python自帶的logging我個人不推介使用,不太Pythonic,而開源的Loguru庫成為眾多工程師及項目中首選,本期將同時對logging及Loguru進行使用對比,希望有所幫助。

快速示例

在logging中,默認的日志功能輸出的信息較為有限:

import logging

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")

if __name__ == "__main__":
    main()

輸出(logging默認日志等級為warning,故此處未輸出info與debug等級的信息):

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

再來看看loguru,默認生成的信息就較為豐富了:

from loguru import logger

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中使用%達到格式化目的:

import logging

# Create a logger and set the logging level
logging.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")

輸出:

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

而loguru使用和f-string相同的{}格式,更方便:

from loguru import logger

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

日志保存

在logging中,實現日志保存與日志打印需要兩個額外的類,FileHandler 和 StreamHandler:

import logging

logging.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方法即可達到目的:

from loguru import logger

logger.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()

日志輪換

日志輪換指通過定期創建新的日志文件并歸檔或刪除舊的日志來防止日志變得過大。

在logging中,需要一個名為 TimedRotatingFileHandler 的附加類,以下代碼示例代表每周切換到一個新的日志文件 ( when=“WO”, interval=1 ),并保留最多 4 周的日志文件 ( backupCount=4 ):

import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Create a formatter with the desired log format
formatter = 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 參數添加到 add 方法來達到目的,如下示例,同樣肥腸方便:

from loguru import logger

logger.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()

日志篩選

日志篩選指根據特定條件有選擇的控制應輸出與保存哪些日志信息。

在logging中,實現該功能需要創建自定義日志過濾器類:

import logging


logging.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 filter
custom_filter = CustomFilter()

# Get the root logger and add the custom filter to it
logger = logging.getLogger()
logger.addFilter(custom_filter)


def main():
    logger.info("Hello Cai Xukong")
    logger.info("Bye Cai Xukong")


if __name__ == "__main__":
    main()

在loguru中,可以簡單地使用lambda函數來過濾日志:

from loguru import logger

logger.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中捕獲異常較為不便且難以調試,如:

import logging

logging.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 / b


def 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 / b
ZeroDivisionError: division by zero

上面輸出的信息未提供觸發異常的c值信息,而在loguru中,通過顯示包含變量值的完整堆棧跟蹤來方便用戶識別:

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 / b
ZeroDivisionError: division by zero

值得一提的是,loguru中的catch裝飾器允許用戶捕獲函數內任何錯誤,且還會標識發生錯誤的線程:

from loguru import logger


def division(a, b):
    return a / b


@logger.catch
def nested(c):
    division(1, c)


if __name__ == "__main__":
    nested(0)

OK,作為普通玩家以上功能足以滿足日常日志需求,通過對比logging與loguru應該讓大家有了直觀感受,哦對了,loguru如何安裝?

pip install loguru

以上就是本期的全部內容,期待點贊在看,我是啥都生,下次再見。

責任編輯:趙寧寧 來源: 啥都會一點的研究生
相關推薦

2024-11-29 08:20:22

Autowired場景項目

2024-11-12 10:30:54

Docker部署數據庫

2024-06-04 00:10:00

開發拷貝

2018-11-29 14:30:42

數據庫外鍵約束應用程序

2024-09-12 08:32:42

2025-05-16 02:00:00

HashMapJava代碼

2021-08-23 13:02:50

MySQLJOIN數據庫

2025-10-17 01:25:00

SpringIDEA@Autowired

2022-01-11 10:29:32

Docker文件掛載

2025-04-29 07:06:20

2021-01-13 09:55:29

try-catch-fJava代碼

2021-07-04 14:19:03

RabbitMQ消息轉換

2020-08-31 11:20:53

MySQLuuidid

2024-03-11 11:02:03

Date類JavaAPI

2023-09-27 23:03:01

Java虛擬線程

2020-07-02 14:12:52

C++語言編程

2024-07-29 09:03:00

2020-06-18 10:21:46

Python程序員技術

2020-02-25 17:04:05

數據庫云原生分布式

2022-12-26 00:00:03

非繼承關系JDK
點贊
收藏

51CTO技術棧公眾號

国产精品美乳在线观看| 精品国产乱码一区二区三| 亚洲AV午夜精品| 青草久久视频| 国产麻豆91精品| 亚洲日本中文字幕| 福利视频一二区| 国产99对白在线播放| av亚洲在线观看| 欧美视频一区二区三区…| wwwxx欧美| 精品国产欧美日韩不卡在线观看 | 日韩在线视频二区| 男女激情无遮挡| 亚洲精品福利网站| 三级久久三级久久| 亚洲欧美一区二区三区四区 | 欧美人与禽猛交乱配| 国产精品三级| 日韩欧美国产激情| 日本丰满大乳奶| 精品国产av 无码一区二区三区 | 国产一区二区三区四区大秀| 欧美一区二区在线看| 亚洲高清在线观看一区| 国产又粗又猛又黄视频| 伊人久久大香线蕉综合网蜜芽| 亚洲va欧美va人人爽午夜| 3d动漫精品啪啪一区二区三区免费 | 色天天综合狠狠色| 中文成人无字幕乱码精品区| 女同一区二区免费aⅴ| 国产女人18毛片水真多成人如厕| 国产精品扒开腿做爽爽爽男男| 欧美老熟妇乱大交xxxxx| 国产精品扒开腿做爽爽爽视频软件| 久久视频一区二区| 日本精品性网站在线观看| av男人的天堂av| 亚洲人免费短视频| 欧美色图在线视频| 999在线观看视频| 影音先锋男人在线资源| 成人午夜电影久久影院| 91精品国产91久久久久久久久| 丰满大乳奶做爰ⅹxx视频| 国产欧美一区二区三区精品酒店| 欧美国产精品v| 91大片在线观看| 在线免费av片| 亚洲视频高清| 亚洲人成网在线播放| 性欧美丰满熟妇xxxx性久久久| 偷拍中文亚洲欧美动漫| 亚洲欧美偷拍卡通变态| 国产伦精品一区二区三区在线| 精品欧美一区二区三区免费观看| 国产亚洲一卡2卡3卡4卡新区| 亚洲国产成人在线播放| 粉色视频免费看| 韩国日本一区| 中文字幕不卡三区| 亚洲精品国产精品国自产| 日韩国产福利| 激情五月激情综合网| 97超级碰碰人国产在线观看| 国产精品国产三级国产专区52| av成人黄色| 久热99视频在线观看| a视频免费观看| 中文字幕精品影院| 国产亚洲欧美另类中文| 久久久久久久久久影视| 91tv亚洲精品香蕉国产一区| 亚洲国产成人91porn| 亚洲三区在线| 免费福利在线观看| 高清av一区二区| 国产精品网红直播| 日韩高清精品免费观看| 在线精品国产| 在线观看日韩欧美| 香蕉视频黄色在线观看| 亚洲电影一区| 欧美日韩国产高清一区| 日韩av一二三四| 人人草在线视频| 一区二区三区四区蜜桃 | 国产精品自拍区| 精品国模在线视频| 偷拍夫妻性生活| 99精品美女| 一区二区在线视频| 国产精品免费人成网站酒店| 欧美日韩亚洲在线观看| 操日韩av在线电影| 中国一级免费毛片| 日本网站在线观看一区二区三区 | 欧美日韩综合在线观看| 美日韩一区二区| 日韩美女毛茸茸| 亚洲视频久久久| 成人高清视频免费观看| 丁香五月网久久综合| 国产精品探花视频| 毛片av中文字幕一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕在线网站| 秋霞成人午夜伦在线观看| 亚洲一区二区三区久久| 国产精品无码久久av| www.爱久久.com| 精品麻豆av| 日韩电影在线观看完整版| 国产精品第13页| 在线视频欧美一区| sm国产在线调教视频| 亚洲精品欧美二区三区中文字幕| 亚洲精品视频一二三| 丁香花在线电影小说观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 91av俱乐部| 在线看欧美视频| 亚洲成人在线视频播放| 永久免费看mv网站入口| 亚洲成人精品| 九九热r在线视频精品| 欧美成人三级视频| 亚洲福利精品| 欧美影院久久久| 性色av一区二区三区四区| 欧美bbbbb| 久久av一区二区三区漫画| 国产中文在线| 亚洲日韩欧美一区二区在线| 日本新janpanese乱熟| 任你躁在线精品免费| 欧美激情网友自拍| 国产午夜性春猛交ⅹxxx| 国产精品一区不卡| 一本一道久久a久久综合精品| 影视一区二区三区| 日韩精品有码在线观看| 婷婷丁香综合网| 午夜精品久久久久99热蜜桃导演| 亚州国产精品久久久| 波多野结衣黄色网址| 狠狠狠色丁香婷婷综合久久五月| 日本午夜精品一区二区三区| www视频在线看| 3751色影院一区二区三区| 国产a级片视频| 国产精品a久久久久| 日韩美女在线看| 香蕉视频黄色片| 国产精品福利一区| 99国产精品久久久久久| 精品中国亚洲| 日韩在线精品一区| 欧美性受xxx黑人xyx性爽| 欧美国产欧美综合| 国产3p在线播放| 在线观看国产精品入口| www日韩av| 免费看男女www网站入口在线| 日韩av中文字幕在线| 91日韩中文字幕| 国产不卡在线视频| 国产婷婷一区二区三区| 网红女主播少妇精品视频| 超碰91人人草人人干| 午夜精品在线播放| 欧美午夜视频在线观看| 亚洲AV无码成人精品区明星换面| 欧美午夜一区二区福利视频| 国产美女精品久久久| 日韩三级电影网| 日本道免费精品一区二区三区| 久久久久无码精品| 日韩一区自拍| 国产成人精品最新| 天天摸天天碰天天爽天天弄| 亚洲乱码中文字幕| 中文字幕第3页| 久色成人在线| 奇米影视首页 狠狠色丁香婷婷久久综合| 播放一区二区| 欧美激情精品久久久久| 在线观看免费中文字幕| 一区二区三区视频在线看| 亚洲专区区免费| 激情另类小说区图片区视频区| 美女扒开大腿让男人桶| 涩爱av色老久久精品偷偷鲁 | 日本亚洲自拍| 136福利精品导航| 久久精品国产成人精品| 日本高清视频免费看| 亚洲精品欧美专区| 91中文字幕永久在线| 国产美女精品一区二区三区| 亚洲图片小说在线| 国产在线播放精品| 国内精品久久久久久久| 欧美一级淫片免费视频魅影视频| 91精品1区2区| 国语对白一区二区| 成人av影院在线| 三级av免费观看| 日韩情爱电影在线观看| 激情一区二区三区| 国产精品国产三级在线观看| 久久中文字幕国产| 国产在线观看精品一区| 精品欧美乱码久久久久久| 久久精品女人毛片国产| 国产精品国产三级国产普通话三级| 国产免费一区二区三区最新6| 尹人成人综合网| 中文精品视频一区二区在线观看| 亚洲人成精品久久久| 国产精品美女主播在线观看纯欲| 九色porny丨入口在线| 久久99国产精品自在自在app| 午夜毛片在线| 日韩视频在线一区二区| 日本三级理论片| 亚洲欧美乱综合| 午夜激情视频在线播放| 欧美国产日韩精品免费观看| 成人影视免费观看| 91视频91自| 久热精品在线观看视频| 久久精品一区二区三区中文字幕| 手机在线观看国产精品| 成人永久在线| 国产欧美一区二区| 久色国产在线| 精品中文字幕在线观看| 国产1区在线| 久久久久北条麻妃免费看| 午夜激情在线观看| 日日骚av一区| 成人免费看片| 久久成人一区二区| 在线免费av导航| 美乳少妇欧美精品| 日韩av高清在线| 国产视频精品xxxx| 久久久久久女乱国产| 亚洲九九九在线观看| 免费观看成年在线视频网站| 亚洲视频在线看| 国产黄色在线| 精品国产凹凸成av人网站| 久久久久久亚洲av无码专区| 日韩欧美精品免费在线| 日本久久综合网| 欧美视频三区在线播放| 日韩伦理在线视频| 狠狠躁夜夜躁人人爽天天天天97 | 一区二区三区在线不卡| 欧美激情精品久久| 亚洲国产精品成人综合色在线婷婷 | 欧美国产综合一区二区| 国产精品18在线| www.欧美亚洲| 亚欧洲乱码视频| 国产蜜臀av在线一区二区三区| 99热99这里只有精品| 亚洲综合色丁香婷婷六月图片| 中文字幕av久久爽一区| 国产精品每日更新在线播放网址| 星空大象在线观看免费播放| 91在线视频在线| 一区二区在线免费观看视频| 成人免费毛片app| 人妻大战黑人白浆狂泄| 中文字幕一区在线| 国产真实乱人偷精品视频| 色屁屁一区二区| 国产又大又长又粗| 亚洲高清免费观看高清完整版| 激情小视频在线观看| 不卡av日日日| 免费电影日韩网站| 亚洲a成v人在线观看| 刘亦菲毛片一区二区三区| 99久久夜色精品国产亚洲狼| 久久久久久久有限公司| 日韩国产在线| 无码人妻精品一区二区蜜桃网站| 91综合视频| 少妇免费毛片久久久久久久久| 1024精品久久久久久久久| 男女视频网站在线观看| 麻豆精品蜜桃视频网站| 国产精品麻豆入口| 国产精品久久久久久福利一牛影视 | 26uuu国产精品视频| 国产精品第一| 国产精品久久一区| 亚洲日本va午夜在线电影| 欧美日韩在线播放一区二区| 亚洲区小说区图片区qvod| 中文字幕在线中文字幕日亚韩一区| 亚洲激情精品| 91九色丨porny丨国产jk| 日韩福利电影在线观看| 人妻换人妻a片爽麻豆| 国产精品狼人久久影院观看方式| 久草手机在线观看| 精品免费99久久| 黄页视频在线播放| 欧美www在线| 少妇精品视频一区二区免费看| 国产精品三区在线| 91精品国产乱码久久久久久久| 无码人妻丰满熟妇区毛片| 成人一道本在线| 538精品在线视频| 欧美蜜桃一区二区三区| 欧美一区二区三区公司| 91国内精品视频| 在线电影国产精品| 国产中文字幕在线| 欧美专区在线观看| 成人av色网站| 麻豆91蜜桃| 日本一区二区在线看| 黄色国产精品视频| 蜜桃视频一区二区| 免费看污片网站| 午夜视频久久久久久| 亚洲爱情岛论坛永久| 久久综合色影院| 成人国产精品久久| 影音先锋欧美在线| 麻豆国产欧美日韩综合精品二区| 欧美熟妇激情一区二区三区| 黑人狂躁日本妞一区二区三区 | 国产一二三四五| 久久99精品视频| 无码人妻丰满熟妇区毛片蜜桃精品| 福利在线一区| 欧美丝袜美女中出在线| 国产伦理一区二区| 欧美一区二区福利在线| 午夜视频在线免费观看| 国产日韩精品在线播放| 欧美freesextv| 污污视频网站在线| 亚洲精品免费播放| 亚洲精品国产suv一区| 久久久亚洲天堂| 日韩三级av| 午夜免费一区二区| 波多野结衣中文字幕一区| 久久久精品视频免费| 亚洲韩国欧洲国产日产av| 久操免费在线| 97伦理在线四区| 一本色道精品久久一区二区三区| 特级西西人体4444xxxx| 色吊一区二区三区| 麻豆传媒在线观看| 日本一区二区三区在线播放| 精品av一区二区| 91小视频在线播放| 亚洲午夜精品17c| 91在线精品入口| 欧美另类99xxxxx| 六月丁香久久丫| 国产九九在线视频| 亚洲久本草在线中文字幕| 女人18毛片一区二区三区| 日本久久久久久久久| 天天影视综合| 国产精品无码一区二区三| 在线观看视频一区二区欧美日韩| 欧美一级在线免费观看| 热久久99这里有精品| 999国产精品永久免费视频app| 在线观看你懂的视频| 大荫蒂欧美视频另类xxxx| 亚洲精品传媒| 九色一区二区| 精品午夜一区二区三区在线观看| 国产第100页| 中文字幕欧美国内| 成人看片网站| www.欧美黄色| 国产欧美一区二区精品仙草咪| 国产农村老头老太视频| 日本高清+成人网在线观看| 中文字幕免费一区二区| 久久久久久国产精品无码| 欧美v国产在线一区二区三区| 都市激情亚洲一区| 天堂av在线中文|