Python 中的日誌

在本教程中,我們將學習標準日誌模塊的基礎知識。

什麼是日誌記錄?

日誌是標準庫中的一個 Python 模塊,它提供了與從 Python 程序中發布日誌消息的框架一起工作的工具。日誌用於跟蹤軟件運行時發生的事件。

開發人員在進行日誌記錄時廣泛使用該模塊。它是軟件開發、運行和調試中非常重要的工具。

日誌記錄有利於日誌記錄的存儲。假設沒有日誌記錄,程序在執行過程中被中斷,我們將無法找到問題的實際原因。

不知何故,我們發現了崩潰的原因,但解決這個問題需要花費大量時間。使用日誌記錄,我們可以留下痕迹,這樣如果問題發生在程序中,我們就可以很容易地找到問題的原因。

在運行應用時,我們可能會面臨許多問題,比如我們假設一個整數,我們被賦予了一個浮點數,服務正在維護中,等等。這些問題很難確定,也很耗時。

日誌工作原理

日誌是初學者和企業使用的強大模塊。該模塊提供了組織不同控制處理程序的能力,並向這些處理程序傳輸日誌消息。

要發布日誌消息,我們需要如下導入日誌模塊。


import logging 

現在,我們將調用記錄器來記錄我們想要看到的消息。日誌模塊提供了指定事件嚴重性的五個級別。每個事件都包含可用於記錄嚴重級別事件的並行方法。讓我們了解以下事件及其工作原理。

  1. DEBUG – 用於提供詳細信息,只有在有診斷問題時才使用。
  2. INFO – 它提供了關於事物按照我們想要的方式工作的信息。
  3. WARNING – 用來警告意外發生的事情,否則我們將在即將到來的時間裡面臨問題。
  4. ERROR – 用來在我們遇到一些嚴重的麻煩時,通知軟件還沒有執行一些程序。
  5. CRITICAL – 指定嚴重錯誤,程序本身可能無法繼續執行。

以上級別足以處理任何類型的問題。下面給出了這些相應的數值。

| 水平 | 數值 |
| 緊急事件集 | Zero |
| 調試 | Ten |
| 信息 | Twenty |
| 警告 | Thirty |
| 錯誤 | Forty |
| 批評的 | Fifty |

日誌模塊提供了許多功能。它由幾個常量、類和方法組成。常數由後面的所有大寫字母表示;這些類用大寫字母表示。小寫的項目代表方法。

讓我們來看看模塊本身提供的幾個 logger 對象。

  • Logger.info(msg) : 用於在此 Logger 上記錄級別為 info 的消息。
  • 記錄器.警告(msg) : 用於在該記錄器上記錄警告級別的消息。
  • Logger.error(msg) : 用於在此 Logger 上記錄級別為 error 的消息。
  • Logger.critical(msg) : 用於在此日誌記錄程序上記錄級別為 critical 的消息。
  • Logger.log(lvl,msg) : 用於在這個 Logger 上記錄一個整數級 lvl 的消息。
  • Logger.exception(msg) : 用於在此 Logger 上記錄級別為 ERROR 的消息。
  • Logger.setLevel(lvl) : 用於將該 Logger 的開頭設置為 lvl。它將忽略下面寫的所有消息。
  • Logger . addfilter(filter):用於向該 logger 添加特定的篩選器。
  • Logger . remove filter(filter):用於為此 logger 消除特定的篩選器。
  • 記錄器.過濾器(記錄):它把記錄器的過濾器放到記錄上。如果記錄可用並且要處理,則返回真。否則,它將返回 False。
  • Logger.addHandler(hdlr) : 用於將特定的處理程序 hdlr 添加到此記錄器的中。
  • Logger . remove handler(hdlr):用於將特定的處理程序 hdlr 排除到該 logger。
  • Logger.hasHandlers() : 用於驗證記錄器是否包含任何已配置的處理程序。

讓我們理解下面的例子。

示例-


import logging

logging.debug('The debug message is displaying')
logging.info('The info message is displaying')
logging.warning('The warning message is displaying')
logging.error('The error message is displaying')
logging.critical('The critical message is displaying')

輸出:

WARNING:root:The warning message is displaying
ERROR:root:The error message is displaying
CRITICAL:root:The critical message is displaying 

說明:

正如我們在上面的輸出中看到的,每條消息都與根一起顯示,根是為其默認日誌記錄程序指定的日誌記錄模塊名稱。消息和級別名稱用冒號(:)分隔,並以默認輸出格式打印消息。

我們可以注意到 debug() 和 info() 消息沒有顯示消息,因為默認情況下,日誌模塊記錄的消息的嚴重級別為 WARNING、ERROR 和 CRITICAL 。

基本配置

日誌記錄的主要任務是將記錄的事件存儲在文件中。日誌模塊提供基本配置(kwarg)** ,用於配置日誌。

它接受一些常用的論點如下。

  • 級別- 指定的嚴重級別由根級別設置。
  • 文件名- 指定一個文件。
  • 文件模式- 以特定模式打開文件。打開文件的默認模式是 a,這意味着我們可以追加內容。
  • 格式- 格式定義日誌消息的格式。

我們可以通過使用我們想要記錄的級別參數來設置日誌消息的級別。我們需要傳遞類中的一個常量,它將允許所有的日誌調用。

讓我們理解下面的例子。

示例-


import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug('The dubug message is logged')

輸出:


DEBUG:root: The debug will be get logged

同樣,我們可以將消息記錄到一個文件中,而不是顯示在控制台上,文件名和文件模式可以用在基本配置()功能中,我們可以使用格式屬性來決定消息的格式。讓我們理解下面的例子。

示例-


import logging

logging.basicConfig(filename='msg.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.warning('This will get logged to a file')

輸出:


root - WARNING - This will get logged to a file

說明:

以上輸出將顯示在消息日誌文件中,而不是控制台中。我們在 w 中打開了文件,這意味着文件是以“寫模式”打開的。如果多次調用 basicConfig() ,那麼程序的每次運行都會重寫日誌文件的輸出。basiconfig()函數可以通過傳遞附加參數(https://docs . python . org/3/library/logging . html # logging . basiconfig)進行修改。

讓我們理解下面的例子。

示例-


import logging

#Create and configure logger using the basicConfig() function
logging.basicConfig(filename="newfile.log",
               format='%(asctime)s %(message)s',
               filemode='w')

#Creating an object of the logging
logger=logging.getLogger()

#Setting the threshold of logger to DEBUG
logger.setLevel(logging.DEBUG)

#Test messages
logger.debug("This is a harmless debug Message")
logger.info("This is just an information")
logger.warning("It is a Warning. Please make changes")
logger.error("You are trying to divide by zero")
logger.critical("Internet is down") 

輸出:

2020-09-05 13:17:39,204 This is a harmless debug Message
2020-09-05 13:17:39,205 This is just an information
2020-09-05 13:17:39,205 It is a Warning. Please make changes
2020-09-05 13:17:39,205 You are trying to divide by zero
2020-09-05 13:17:39,205 Internet is down

說明:

上面的代碼將生成一個文件,我們可以在打開文件時看到輸出。

格式化輸出

程序中作為日誌消息傳遞的字符串可以根據我們的要求進行修改。給定字符串和部分日誌記錄中有一些基本元素。讓我們理解下面的例子。

示例-


import logging

logging.basicConfig(format='%(process)d-%(levelname)s-%(message)s')
logging.warning('This is a Warning Message')

輸出:

18472-WARNING-This is a Warning Message

格式參數可以按照我們的要求接受任何形式的具有日誌記錄屬性的字符串。

讓我們理解下面的例子-

示例-


import logging

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('Admin logged in')

輸出:

2020-09-02 20:12:06,288 - Admin logged in

% ASC time 屬性增加了日誌記錄的創建時間。我們還可以使用 datefmt 屬性自定義格式,它提供了與 datetime 模塊相同的功能。

示例-


import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Admin logged out')

輸出:

02-Sep-20 13:29:05 - Admin logged out

記錄變量數據

有時,我們希望在日誌中包含來自應用的動態信息。日誌記錄方法接受字符串作為參數,最好用變量數據格式化字符串並傳遞給日誌方法。

但除此之外,我們還可以為消息使用格式字符串,並將變量數據作為參數追加。

讓我們理解下面的例子-


import logging

name = 'Peter Decosta'

logging.error('%s raised an error', name)

輸出:

ERROR:root: Peter Decosta raised an error

說明:

傳遞給該方法的參數將作為消息中的變量數據進行卷積。

我們可以使用 f{string}來格式化給定的字符串。它提供了一種簡單快捷的方法來處理字符串。

示例-


import logging

name = 'Antonio Mino'

logging.error(f'{name} raised an error')

輸出:

ERROR:root: Antonio Mino raised an error

捕獲棧跟蹤

我們可以使用日誌模塊在應用中捕獲完整的跟蹤棧。測井功能中有一個 exc_info 參數;如果設置為真,則可以捕獲異常信息。

讓我們理解下面的例子-

示例-


import logging

a = 10
b = 0

try:
  c = a / b
except Exception as e:
  logging.error("Exception occurred", exc_info=True)

輸出:

ERROR:root:Exception occurred
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/loggingFile.py", line 224, in <module>
    c = a / b
ZeroDivisionError: division by zero

說明:

如果我們不將 true 設置為 exc_info,輸出將不會通知我們異常。如果一個錯誤只顯示以下輸出,那麼很難在數千行代碼中調試它。


ERROR:root:Exception occurred

還有其他選項可以獲得關於異常的完整信息。日誌模塊提供異常()方法,記錄一條帶有 ERROR 的消息,並附上異常信息。要使用它,調用日誌記錄.異常()方法與調用日誌記錄.錯誤(exc_info = True) 相同。

讓我們理解下面的例子。

示例-


import logging

a = 10
b = 0

try:
  c = a / b
except Exception as e:
  logging.exception("Exception occurred", exc_info=True)

輸出:

ERROR:root:Exception occurred
Traceback (most recent call last):
  File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/loggingFile.py", line 224, in <module>
    c = a / b
ZeroDivisionError: division by zero

我們可以使用 error()、debug()或 critical()方法中的任意一個選項來獲取有關異常的信息。

類和函數

到目前為止,我們已經看到了名為根的默認記錄器。無論何時調用其功能,如 logging.debug()、 logging.error()等,都會用到日誌模塊。我們也可以通過創建記錄器類的對象來定義自己的記錄器。這裡,我們定義了常用的類和函數。

下面是日誌模塊中定義的類和函數。

  • 記錄器- 記錄器對象用於直接調用函數。
  • 日誌記錄- 它自動創建日誌記錄文件,該文件包含與被記錄的所有事件相關的信息,如記錄器的名稱、功能、行號、消息等。
  • 處理程序- 處理程序用於將日誌記錄發送到輸出端點。文件處理器、流處理器、HTTPHandler、SMTTPHandler 是處理器的子類。
  • 格式化程序- 格式化程序用於定義輸出的結構。它使用字符串格式化方法來指定日誌消息的格式。

如果我們沒有要格式化的消息,默認情況下使用原始消息。默認格式日期格式是。


%Y-%m-%d %H:%M:%S

以下格式用於以人類可讀的格式製作日誌消息。


'%(asctime)s - %(levelname)s - %(message)s'

我們通常使用 Logger 類的對象,這些對象是使用 logging.getLogger(name) 函數創建的。如果用同一個名稱多次調用 getLogger() 方法,將返回同一個 Logger 對象的引用。

讓我們理解下面的例子:

示例-


import logging

logger = logging.getLogger('first_logger')
logger.warning('This is a warning message')

輸出:

This is a warning message

說明:

我們已經創建了自己的記錄器名稱 first_logger ,但是與根記錄器不同的是, first_logger 不是輸出格式的一部分。要顯示它,請將其傳遞給配置函數。那麼輸出將如下所示。


WARNING:first_logger:This is a warning message

使用處理程序

處理程序通常用於配置日誌記錄程序,並將日誌一次傳輸到許多地方。它通過 HTTP 或電子郵件將日誌消息發送到標準輸出流或文件。

讓我們理解以下創建處理程序的示例。

示例:


import logging

# Create a custom logger_obj
logger_obj = logging.getLogger(__name__)

# Create handlers
w_handler = logging.StreamHandler()
e_handler = logging.FileHandler('file.log')
w_handler.setLevel(logging.WARNING)
e_handler.setLevel(logging.ERROR)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
w_handler.setFormatter(c_format)
e_handler.setFormatter(f_format)

# Add handlers to the logger_obj
logger_obj.addHandler(w_handler)
logger_obj.addHandler(e_handler)

logger_obj.warning('This is a warning message')
logger_obj.error('This is an error message')

輸出:

__main__ - WARNING - This is a warning message
__main__ - ERROR - This is an error message

說明:

在下面的程序中,我們創建了一個名為 logger_obj 的自定義日誌記錄程序,並創建了一個日誌記錄程序來存儲日誌事件的所有記錄,並將其傳遞給它擁有的所有處理程序: w_handlers 和 e_handlers 。

w_handlers 是一個級別為“警告”的流處理程序。它接受來自日誌記錄的日誌,以格式字符串生成輸出,並將其打印到屏幕上。

e_handler 是一個文件處理程序,級別為錯誤。它將日誌記錄忽略為其警告級別。

結論

日誌模塊靈活易用。這對於跟蹤日誌記錄和向用戶顯示適當的消息非常有用。它提供了創建自定義日誌級別、處理程序類和許多其他有用方法的靈活性。

它還為小型項目提供基本的日誌記錄。

在本教程中,我們已經討論了日誌模塊的所有基本概念。我們已經介紹了不同級別的生成消息。


原創文章,作者:CQN85,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129993.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CQN85的頭像CQN85
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論