最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?logging日志模塊的概念與實(shí)踐講解

 更新時(shí)間:2023年07月19日 15:12:00   作者:techlead_krischang  
本文通過具體的代碼示例為大家解釋了如何高效地使用logging模塊進(jìn)行日志記錄,以及如何避免常見的陷阱,希望可以幫助大家更好地掌握這個(gè)強(qiáng)大的工具

一、Python 日志模塊簡(jiǎn)介

日志的概念及其在軟件開發(fā)中的作用

在開發(fā)過程中,為了記錄應(yīng)用程序的運(yùn)行情況,通常我們會(huì)采用打印日志的方式,這種方式不僅可以幫助我們了解軟件系統(tǒng)的運(yùn)行狀態(tài),還可以在系統(tǒng)出現(xiàn)錯(cuò)誤時(shí),幫助我們快速定位問題。

例如,假設(shè)你有以下一段代碼,它只是簡(jiǎn)單地輸出一些信息:

print("This is some information.")

輸出:

This is some information.

但是,如果我們需要記錄更復(fù)雜的信息,如錯(cuò)誤信息、警告或者其他重要的運(yùn)行時(shí)信息,僅僅使用print就顯得力不從心。這就是我們需要日志模塊的地方。

Python logging日志模塊簡(jiǎn)介

Python內(nèi)置的logging模塊為我們提供了一套完整的日志記錄解決方案。在許多情況下,你可能希望你的應(yīng)用程序能夠在運(yùn)行時(shí)輸出某種形式的狀態(tài)信息,特別是當(dāng)應(yīng)用程序需要處理長(zhǎng)時(shí)間運(yùn)行的任務(wù),或者當(dāng)你面臨需要診斷的問題時(shí),logging模塊便是你的得力助手。

logging模塊可以幫助我們捕獲、處理和記錄日志信息,使得我們可以在程序運(yùn)行的任何地方快速記錄日志信息。相比于簡(jiǎn)單的print函數(shù),它更具有靈活性,能夠同時(shí)輸出日志到多個(gè)地方,如:控制臺(tái)、文件、HTTP GET/POST,SMTP,Socket等,并且可以獨(dú)立設(shè)置每個(gè)輸出的日志等級(jí)。

以下是一個(gè)簡(jiǎn)單的例子來說明如何使用logging模塊:

import logging
# Create a logger and set the log level to INFO
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Add a StreamHandler to send log messages to console
console_handler = logging.StreamHandler()
logger.addHandler(console_handler)
# Log an informational message
logger.info("This is an informational message.")

這段代碼會(huì)輸出以下信息到控制臺(tái):

This is an informational message.

logging模塊的基本組成

logging模塊主要由以下幾個(gè)部分組成:

Logger: 用于提供應(yīng)用程序直接使用的接口。

Handler: 將(logger產(chǎn)生的)日志記錄發(fā)送到合適的目的輸出。

Filter: 提供了更精細(xì)的工具來決定輸出哪些日志記錄。

Formatter: 指定日志記錄的最終輸出格式。

二、logging日志模塊詳解

logging的基礎(chǔ)使用

使用Python的logging模塊相當(dāng)簡(jiǎn)單,下面是一個(gè)基本的例子,說明如何創(chuàng)建一個(gè)日志并輸出到控制臺(tái)。

import logging
# This will log the message to the console
logging.warning('This is a warning message')

這段代碼將輸出以下警告信息:

WARNING:root:This is a warning message

理解日志級(jí)別

在logging模塊中,我們有5個(gè)級(jí)別來描述日志的重要性。這些級(jí)別分別是:

DEBUG:詳細(xì)信息,通常僅在診斷問題時(shí)使用。

INFO:確認(rèn)事情按預(yù)期進(jìn)行。

WARNING:出現(xiàn)了一些預(yù)期之外的事情,或者在不久的將來可能出現(xiàn)問題(例如,“磁盤空間不足”)。但是軟件仍在正常工作。

ERROR:由于更嚴(yán)重的問題,軟件不能執(zhí)行某些功能。

CRITICAL:嚴(yán)重的錯(cuò)誤,表明程序本身可能無法繼續(xù)運(yùn)行。

默認(rèn)情況下,logging模塊將日志記錄到控制臺(tái),并且只處理級(jí)別為WARNING以上的日志。

Loggers、Handlers和Formatters

這一部分我們將會(huì)詳解Loggers、Handlers和Formatters這三個(gè)主要組件。

Loggers的作用和使用

Logger是一個(gè)日志對(duì)象,主要任務(wù)就是記錄日志。在應(yīng)用程序代碼中任何需要日志的地方,都可以創(chuàng)建一個(gè)logger實(shí)例,并用其記錄需要的信息。下面是一個(gè)簡(jiǎn)單的使用logger的例子:

import logging
# Create a logger
logger = logging.getLogger(__name__)
# Log some messages
logger.debug("This is a debug message.")
logger.info("This is an informational message.")
logger.warning("Careful! Something does not look right.")
logger.error("You have encountered an error.")
logger.critical("The program cannot recover from this situation!")

注意:當(dāng)我們運(yùn)行這段代碼時(shí),我們并沒有看到任何輸出。這是因?yàn)槟J(rèn)情況下,logger的級(jí)別設(shè)置為WARNING,因此只有級(jí)別為WARNING以上的日志會(huì)被處理。

Handlers的種類和作用

Handler對(duì)象負(fù)責(zé)發(fā)送日志記錄到合適的目的地。不同的handler可以將日志發(fā)送到控制臺(tái),文件,郵件,甚至HTTP POST參數(shù)等。下面是一個(gè)簡(jiǎn)單的例子,說明如何使用handler將日志記錄到文件和控制臺(tái):

import logging
# Create a logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Create a file handler
file_handler = logging.FileHandler('my_log.log')
logger.addHandler(file_handler)
# Create a console handler
console_handler = logging.StreamHandler()
logger.addHandler(console_handler)
# Log some messages
logger.debug("This is a debug message.")
logger.info("This is an informational message.")
logger.warning("Careful! Something does not look right.")
logger.error("You have encountered an error.")
logger.critical("The program cannot recover from this situation!")

Formatters的功能和自定義日志格式

Formatter對(duì)象指定日志記錄的最終順序,結(jié)構(gòu)和內(nèi)容。你可以自定義日志信息的格式,使得日志信息更具有可讀性。下面是一個(gè)如何使用formatter的例子:

import logging
# Create a logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Create a console handler
console_handler = logging.StreamHandler()
# Create a formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Add the formatter to the console handler
console_handler.setFormatter(formatter)
# Add the console handler to the logger
logger.addHandler(console_handler)
# Log some messages
logger.debug("This is a debug message.")
logger.info("This is an informational message.")
logger.warning("Careful! Something does not look right.")
logger.error("You have encountered an error.")
logger.critical("The program cannot recover from this situation!")

三、Python日志模塊在實(shí)踐中的應(yīng)用

使用日志記錄異常信息

在Python編程中,經(jīng)常需要捕獲和處理異常。這時(shí),使用logging模塊記錄異常信息會(huì)非常方便。在logging模塊中,我們可以使用exception()方法記錄異常堆棧信息。如下例所示:

import logging
logger = logging.getLogger(__name__)
try:
    a = [1, 2, 3]
    value = a[3]
except IndexError as e:
    logger.error("Unhandled exception", exc_info=True)
		```
當(dāng)運(yùn)行此段代碼,日志記錄器將記錄下出現(xiàn)的異常信息,如下:
```python
ERROR:__main__:Unhandled exception
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
IndexError: list index out of range

使用RotatingFileHandler進(jìn)行日志滾動(dòng)

當(dāng)我們的應(yīng)用程序運(yùn)行很長(zhǎng)時(shí)間,并產(chǎn)生大量的日志時(shí),所有的日志都寫入一個(gè)文件可能會(huì)導(dǎo)致這個(gè)日志文件過大。這時(shí),我們可以使用RotatingFileHandler來進(jìn)行日志滾動(dòng)。當(dāng)達(dá)到一定的大小或者一定的時(shí)間,RotatingFileHandler會(huì)自動(dòng)備份當(dāng)前日志文件,并創(chuàng)建一個(gè)新的日志文件繼續(xù)寫入。如下例所示:

import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Create a file handler
handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
logger.addHandler(handler)
# Log some messages
for _ in range(10000):
    logger.info("Hello, world!")
		```
##這段代碼將在日志文件大小達(dá)到2000字節(jié)時(shí)創(chuàng)建一個(gè)新的日志文件,并保留最新的10個(gè)日志文件。
## 配置日志級(jí)別
##根據(jù)我們的需要,可以在運(yùn)行時(shí)改變?nèi)罩镜募?jí)別。例如,當(dāng)我們?cè)谡{(diào)試應(yīng)用程序時(shí),我們可能需要輸出所有級(jí)別的日志。但是在生產(chǎn)環(huán)境中,我們可能只關(guān)心錯(cuò)誤及以上級(jí)別的日志。我們可以通過setLevel()函數(shù)來改變?nèi)罩炯?jí)別。如下例所示:
```python
import logging
# Create a logger
logger = logging.getLogger(__name__)
# Set log level to DEBUG
logger.setLevel(logging.DEBUG)
# Log some messages
logger.debug("This is a debug message.")
logger.info("This is an informational message.")
logger.warning("Careful! Something does not look right.")
logger.error("You have encountered an error.")
logger.critical("The program cannot recover from this situation!")

四、Python日志模塊的最佳實(shí)踐

在模塊級(jí)別使用__name__創(chuàng)建logger

在Python中,__name__變量是一個(gè)內(nèi)置變量,它代表當(dāng)前模塊的名稱。當(dāng)我們?cè)诿總€(gè)模塊級(jí)別上創(chuàng)建logger并使用__name__作為名稱,我們可以輕松地追蹤日志記錄發(fā)生在哪個(gè)模塊。

import logging
# Create a logger at the module level
logger = logging.getLogger(__name__)

使用合適的日志級(jí)別

不同的日志級(jí)別表示了不同的嚴(yán)重性。正確地使用日志級(jí)別可以幫助我們?cè)诖罅康娜罩局姓业轿覀冴P(guān)心的信息。一般來說,對(duì)于非常嚴(yán)重的錯(cuò)誤,我們應(yīng)使用CRITICAL或ERROR;對(duì)于警告信息,我們應(yīng)使用WARNING;對(duì)于常規(guī)的運(yùn)行信息,我們應(yīng)使用INFO;對(duì)于調(diào)試信息,我們應(yīng)使用DEBUG。

使用結(jié)構(gòu)化的日志消息

當(dāng)我們的應(yīng)用程序有大量的日志時(shí),我們可能希望以一種可解析的方式記錄日志消息。例如,我們可以使用JSON格式記錄日志。這樣,我們就可以使用各種日志分析工具分析日志。

import logging
import json
# Create a logger
logger = logging.getLogger(__name__)
# Log a structured message
logger.info(json.dumps({
    'action': 'User login',
    'username': 'user123',
    'ip_address': '123.123.123.123',
    'status': 'success',
}))

使用異常日志記錄

當(dāng)捕獲到異常時(shí),我們應(yīng)使用logger.exception(),這樣就可以在日志中記錄下完整的異常堆棧信息。

import logging
logger = logging.getLogger(__name__)
try:
    x = 1 / 0
except ZeroDivisionError:
    logger.exception("Zero Division Error Caught.")

這樣的日志會(huì)包含足夠的信息幫助我們找到和修復(fù)問題。

不要在日志中記錄敏感信息

日志可能被攻擊者用來尋找系統(tǒng)的漏洞,因此我們絕對(duì)不能在日志中記錄敏感信息,如密碼、密鑰和用戶的私有數(shù)據(jù)。

五、總結(jié)

在這篇文章中,我們?cè)敿?xì)介紹了Python的logging模塊,包括它的基本介紹,詳解,實(shí)踐中的應(yīng)用,以及一些最佳實(shí)踐??偨Y(jié)上述內(nèi)容:

  • logging模塊是Python內(nèi)置的一種靈活且強(qiáng)大的日志記錄工具,它可以將程序運(yùn)行過程中的信息輸出到各種輸出源,如標(biāo)準(zhǔn)輸出、文件、郵件、網(wǎng)絡(luò)等。
  • logging模塊提供了多種級(jí)別的日志記錄,包括DEBUG,INFO,WARNING,ERROR和CRITICAL。我們可以根據(jù)需求設(shè)置不同的日志級(jí)別,以記錄和展示不同嚴(yán)重性的信息。
  • 在實(shí)踐中,我們可以使用logging模塊來記錄異常信息,使用RotatingFileHandler進(jìn)行日志滾動(dòng),以及在運(yùn)行時(shí)改變?nèi)罩炯?jí)別。
  • 對(duì)于logging模塊的最佳實(shí)踐,我們提到了在模塊級(jí)別使用__name__創(chuàng)建logger,使用合適的日志級(jí)別,使用結(jié)構(gòu)化的日志消息,使用異常日志記錄,以及不在日志中記錄敏感信息。

到此這篇關(guān)于Python logging日志模塊的概念與實(shí)踐講解的文章就介紹到這了,更多相關(guān)Python logging日志模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python實(shí)現(xiàn)文件處理程序

    基于Python實(shí)現(xiàn)文件處理程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文件處理程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Python調(diào)整PDF頁面尺寸大小的兩種方法

    Python調(diào)整PDF頁面尺寸大小的兩種方法

    利用Python語言的高效性和靈活性,再結(jié)合Spire.PDF for Python 庫的強(qiáng)大功能,我們可以通過Python代碼輕松實(shí)現(xiàn)對(duì)PDF頁面的批量調(diào)整,在這篇文章中,我們將介紹兩種調(diào)整PDF頁面大小的方法,感興趣的朋友可以參考下
    2024-05-05
  • 詳解pytest分布式執(zhí)行插件?pytest-xdist?的高級(jí)用法

    詳解pytest分布式執(zhí)行插件?pytest-xdist?的高級(jí)用法

    這篇文章主要介紹了pytest分布式執(zhí)行插件?pytest-xdist?的高級(jí)用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Python內(nèi)建類型list源碼學(xué)習(xí)

    Python內(nèi)建類型list源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python內(nèi)建類型list源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python中的OpenCV圖像腐蝕處理和膨脹處理

    Python中的OpenCV圖像腐蝕處理和膨脹處理

    這篇文章主要介紹了Python中的OpenCV圖像腐蝕處理和膨脹處理,OpenCV是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫,可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識(shí)別程序,需要的朋友可以參考下
    2023-08-08
  • python制作一個(gè)簡(jiǎn)單的gui 數(shù)據(jù)庫查詢界面

    python制作一個(gè)簡(jiǎn)單的gui 數(shù)據(jù)庫查詢界面

    這篇文章主要介紹了python制作一個(gè)簡(jiǎn)單的gui 數(shù)據(jù)庫查詢界面,幫助大家更好的理解和學(xué)習(xí)python tkinter的使用,感興趣的朋友可以了解下
    2020-11-11
  • Pytest框架之fixture詳解(二)

    Pytest框架之fixture詳解(二)

    本文詳細(xì)講解了Pytest框架之fixture,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 使用python繪制地圖的示例代碼

    使用python繪制地圖的示例代碼

    要在Python中繪制地圖,你可以使用各種庫和工具包,其中最常用的是matplotlib和folium,本文就來給大家介紹一下如何使用python繪制地圖,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Python對(duì)Excel不同的行分別復(fù)制不同的次數(shù)

    Python對(duì)Excel不同的行分別復(fù)制不同的次數(shù)

    這篇文章主要介紹了如何利用Python實(shí)現(xiàn)讀取Excel表格文件數(shù)據(jù),并將其中符合我們特定要求的那一行加以復(fù)制指定的次數(shù),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-07-07
  • Python中pywin32 常用窗口操作的實(shí)現(xiàn)

    Python中pywin32 常用窗口操作的實(shí)現(xiàn)

    本文主要介紹了Python中pywin32 常用窗口操作的實(shí)現(xiàn),pywin32?主要的作用是供 Python開發(fā)者快速調(diào)用?Windows?API的一個(gè)模塊庫,下面就來具體介紹一下,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

进贤县| 光泽县| 靖安县| 涟源市| 三亚市| 玉环县| 高要市| 金寨县| 惠水县| 珠海市| 玉树县| 康乐县| 四子王旗| 怀化市| 辽阳市| 江华| 广安市| 青川县| 阳泉市| 乌鲁木齐县| 惠来县| 临海市| 昌吉市| 新巴尔虎右旗| 土默特左旗| 丰城市| 博白县| 台江县| 巴青县| 东乡县| 永嘉县| 昌邑市| 讷河市| 蒙山县| 饶平县| 永嘉县| 义马市| 会宁县| 宝山区| 邹平县| 贺州市|