Python日誌模塊:實戰應用與最佳實踐

来源:https://www.cnblogs.com/xfuture/archive/2023/07/19/17565303.html
-Advertisement-
Play Games

**本文詳細解析了Python的logging模塊,從基本介紹到實際應用和最佳實踐。我們通過具體的代碼示例解釋瞭如何高效地使用這個模塊進行日誌記錄,以及如何避免常見的陷阱,旨在幫助讀者更好地掌握這個強大的工具。** ![file](https://img2023.cnblogs.com/other/ ...


本文詳細解析了Python的logging模塊,從基本介紹到實際應用和最佳實踐。我們通過具體的代碼示例解釋瞭如何高效地使用這個模塊進行日誌記錄,以及如何避免常見的陷阱,旨在幫助讀者更好地掌握這個強大的工具。
file

一、Python 日誌模塊簡介

日誌的概念及其在軟體開發中的作用

在開發過程中,為了記錄應用程式的運行情況,通常我們會採用列印日誌的方式,這種方式不僅可以幫助我們瞭解軟體系統的運行狀態,還可以在系統出現錯誤時,幫助我們快速定位問題。

例如,假設你有以下一段代碼,它只是簡單地輸出一些信息:

print("This is some information.")

輸出:

This is some information.

但是,如果我們需要記錄更複雜的信息,如錯誤信息、警告或者其他重要的運行時信息,僅僅使用print就顯得力不從心。這就是我們需要日誌模塊的地方。

Python logging日誌模塊簡介

Python內置的logging模塊為我們提供了一套完整的日誌記錄解決方案。在許多情況下,你可能希望你的應用程式能夠在運行時輸出某種形式的狀態信息,特別是當應用程式需要處理長時間運行的任務,或者當你面臨需要診斷的問題時,logging模塊便是你的得力助手。

logging模塊可以幫助我們捕獲、處理和記錄日誌信息,使得我們可以在程式運行的任何地方快速記錄日誌信息。相比於簡單的print函數,它更具有靈活性,能夠同時輸出日誌到多個地方,如:控制台、文件、HTTP GET/POST,SMTP,Socket等,並且可以獨立設置每個輸出的日誌等級。

以下是一個簡單的例子來說明如何使用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.")

這段代碼會輸出以下信息到控制台:

This is an informational message.

logging模塊的基本組成

logging模塊主要由以下幾個部分組成:

Logger: 用於提供應用程式直接使用的介面。

Handler: 將(logger產生的)日誌記錄發送到合適的目的輸出。

Filter: 提供了更精細的工具來決定輸出哪些日誌記錄。

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

二、logging日誌模塊詳解

logging的基礎使用

使用Python的logging模塊相當簡單,下麵是一個基本的例子,說明如何創建一個日誌並輸出到控制台。

import logging

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

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

WARNING:root:This is a warning message

理解日誌級別

在logging模塊中,我們有5個級別來描述日誌的重要性。這些級別分別是:

DEBUG:詳細信息,通常僅在診斷問題時使用。

INFO:確認事情按預期進行。

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

ERROR:由於更嚴重的問題,軟體不能執行某些功能。

CRITICAL:嚴重的錯誤,表明程式本身可能無法繼續運行。

預設情況下,logging模塊將日誌記錄到控制台,並且只處理級別為WARNING以上的日誌。

Loggers、Handlers和Formatters

這一部分我們將會詳解Loggers、Handlers和Formatters這三個主要組件。

Loggers的作用和使用

Logger是一個日誌對象,主要任務就是記錄日誌。在應用程式代碼中任何需要日誌的地方,都可以創建一個logger實例,並用其記錄需要的信息。下麵是一個簡單的使用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!")

註意:當我們運行這段代碼時,我們並沒有看到任何輸出。這是因為預設情況下,logger的級別設置為WARNING,因此只有級別為WARNING以上的日誌會被處理。

Handlers的種類和作用

Handler對象負責發送日誌記錄到合適的目的地。不同的handler可以將日誌發送到控制台,文件,郵件,甚至HTTP POST參數等。下麵是一個簡單的例子,說明如何使用handler將日誌記錄到文件和控制台:

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對象指定日誌記錄的最終順序,結構和內容。你可以自定義日誌信息的格式,使得日誌信息更具有可讀性。下麵是一個如何使用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日誌模塊在實踐中的應用

使用日誌記錄異常信息

在Python編程中,經常需要捕獲和處理異常。這時,使用logging模塊記錄異常信息會非常方便。在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)
		```
當運行此段代碼,日誌記錄器將記錄下出現的異常信息,如下:

```python
ERROR:__main__:Unhandled exception
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
IndexError: list index out of range

使用RotatingFileHandler進行日誌滾動

當我們的應用程式運行很長時間,並產生大量的日誌時,所有的日誌都寫入一個文件可能會導致這個日誌文件過大。這時,我們可以使用RotatingFileHandler來進行日誌滾動。當達到一定的大小或者一定的時間,RotatingFileHandler會自動備份當前日誌文件,並創建一個新的日誌文件繼續寫入。如下例所示:

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!")
		```
這段代碼將在日誌文件大小達到2000位元組時創建一個新的日誌文件,並保留最新的10個日誌文件。

## 配置日誌級別
根據我們的需要,可以在運行時改變日誌的級別。例如,當我們在調試應用程式時,我們可能需要輸出所有級別的日誌。但是在生產環境中,我們可能只關心錯誤及以上級別的日誌。我們可以通過setLevel()函數來改變日誌級別。如下例所示:
```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日誌模塊的最佳實踐

在模塊級別使用__name__創建logger

在Python中,__name__變數是一個內置變數,它代表當前模塊的名稱。當我們在每個模塊級別上創建logger並使用__name__作為名稱,我們可以輕鬆地追蹤日誌記錄發生在哪個模塊。

import logging

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

使用合適的日誌級別

不同的日誌級別表示了不同的嚴重性。正確地使用日誌級別可以幫助我們在大量的日誌中找到我們關心的信息。一般來說,對於非常嚴重的錯誤,我們應使用CRITICAL或ERROR;對於警告信息,我們應使用WARNING;對於常規的運行信息,我們應使用INFO;對於調試信息,我們應使用DEBUG。

使用結構化的日誌消息

當我們的應用程式有大量的日誌時,我們可能希望以一種可解析的方式記錄日誌消息。例如,我們可以使用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',
}))

使用異常日誌記錄

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

import logging

logger = logging.getLogger(__name__)

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

這樣的日誌會包含足夠的信息幫助我們找到和修複問題。

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

日誌可能被攻擊者用來尋找系統的漏洞,因此我們絕對不能在日誌中記錄敏感信息,如密碼、密鑰和用戶的私有數據。

五、總結

在這篇文章中,我們詳細介紹了Python的logging模塊,包括它的基本介紹,詳解,實踐中的應用,以及一些最佳實踐。總結上述內容:

  1. logging模塊是Python內置的一種靈活且強大的日誌記錄工具,它可以將程式運行過程中的信息輸出到各種輸出源,如標準輸出、文件、郵件、網路等。
  2. logging模塊提供了多種級別的日誌記錄,包括DEBUG,INFO,WARNING,ERROR和CRITICAL。我們可以根據需求設置不同的日誌級別,以記錄和展示不同嚴重性的信息。
  3. 在實踐中,我們可以使用logging模塊來記錄異常信息,使用RotatingFileHandler進行日誌滾動,以及在運行時改變日誌級別。
  4. 對於logging模塊的最佳實踐,我們提到了在模塊級別使用__name__創建logger,使用合適的日誌級別,使用結構化的日誌消息,使用異常日誌記錄,以及不在日誌中記錄敏感信息。

Python的logging模塊是一個非常強大的工具,希望你在閱讀本文後能有更深的理解和更靈活的運用。

如有幫助,請多關註
個人微信公眾號:【Python全視角】
TeahLead_KrisChang,10+年的互聯網和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿裡雲認證雲服務資深架構師,上億營收AI產品業務負責人。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 1.模塊re - 以一定規則,快速檢索文本,或是實現一些替換操作 - 預設下,區分大小寫 # 2.常見的匹配字元表 | 字元 | 描述 | | : : | : : | | \d | 代表任意數字,就是阿拉伯數字 0-9 這些 | | `\D` | 代表非數字的字元。與\d完全相反 | | `\w ...
  • **容器註冊表**是Docker容器鏡像的集中存儲和分發系統。它允許開發人員以這些鏡像的形式輕鬆共用和部署應用程式。容器註冊表在容器化應用程式的部署中發揮著關鍵作用,因為它們提供了一種快速、可靠和安全的方式,在各種生產環境中分發容器鏡像。 以下是當今流行的容器註冊表列表: - **Docker Hu ...
  • 現在剛畢業,很多小伙伴因為找不到工作或者找了很多也不喜歡,再有懶一點的,太熱了根本不想出門到處找。 所以今天給大家分享如何在家就能找到心儀工作 使用Python批量採集招聘數據,進行可視化分析,輕鬆找到心儀工作! 話不多說,我們直接開始~ 準備工作 軟體工具 Python 3.8 Pycharm 谷 ...
  • # EventListenerProvider初始 keycloak提供的事件處理機制,可以通過實現EventListenerProvider介面來實現自定義的事件處理邏輯。在keycloak啟動時,會通過ServiceLoader機制載入所有的EventListenerProvider實現類,並將 ...
  • **作者:張富春(ahfuzhang),轉載時請註明作者和引用鏈接,謝謝!** * [cnblogs博客](https://www.cnblogs.com/ahfuzhang/) * [zhihu](https://www.zhihu.com/people/ahfuzhang/posts) * [G ...
  • # **TCP編程** - **基本介紹** 1. 基於客戶端——服務端的網路通信; 2. 底層使用的是TCP/IP協議; 3. 應用場景舉例:客戶端發送數據,服務端接收並顯示在控制台; 4. 基於Socket的TCP編程; - **示意圖** ![](https://img2023.cnblogs ...
  • 下麵這段優秀的代碼節選自hutool-DateUtil(hutool-all-4.5.18.jar ,maven坐標:cn.hutool:hutool-all:4.5.18),香香的,甜甜的! ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...