|
文章目錄
- 日志記錄
- python的日志記錄模塊
- 創建日志處理程序并配置輸出格式
- 將日志內容輸出到控制臺
- 將日志寫入到文件
- logging更簡單的一種使用方式

日志記錄
日志記錄是一種重要的應用程序開發和維護技術, 它用于記錄應用程序運行時的關鍵信息和事件.
通過適當的日志記錄, 我們可以追蹤應用程序的行為、排查問題和監控系統狀態.
Python 提供了內置的 logging
模塊, 使得日志記錄變得簡單而強大, 日志記錄是將應用程序運行時的關鍵信息寫入日志文件或輸出到控制臺.
它有以下主要目的和優勢:
- 問題排查:當應用程序出現錯誤或異常時, 日志記錄提供了有關問題的關鍵信息, 有助于快速定位和修復錯誤.
- 系統監控:通過記錄應用程序的運行狀態、資源使用情況和性能指標, 日志記錄可以幫助我們監控系統的健康狀況.
- 運行分析:日志記錄允許我們跟蹤應用程序的執行流程和事件, 以便進行性能分析、行為分析和用戶行為分析.
python的日志記錄模塊
Python 提供了內置的 logging
模塊, 它是一個強大而靈活的日志記錄工具.要使用 logging
模塊, 先導入, 然后創建日志記錄器
import logging# 創建日志記錄器logger = logging.getLogger('my_logger')
設置日志級別
日志級別決定了哪些日志消息會被記錄下來.logging
模塊定義了以下幾個日志級別(從低到高):
- DEBUG: 詳細的調試信息, 適用于開發環境.
- INFO: 普通的信息消息, 用于確認應用程序的正常運行.
- WARNING: 警告消息, 表示潛在的問題或不合適的使用.
- ERROR: 錯誤消息, 表示應用程序遇到可恢復的錯誤.
- CRITICAL: 嚴重錯誤消息, 表示應用程序遇到無法恢復的錯誤.
可以設置日志記錄器的級別, 以決定哪些級別的日志消息會被記錄.默認情況下, 日志記錄器的級別是 WARNING
, 這意味著只有 WARNING
、ERROR
和 CRITICAL
級別的消息會被記錄.
logger.setLevel(logging.DEBUG)
import logging# 創建日志記錄器.
logger = logging.getLogger('my_logger')logger.debug(f'這是一條 debug 日志信息.')
logger.info(f'這是一條 info 日志信息.')
logger.warning(f'這是一條 warning 日志信息.')
logger.error(f'這是一條 error 日志信息.')
logger.critical(f'這是一條 critical 日志信息.')# 輸出結果:
這是一條 warning 日志信息.
這是一條 error 日志信息.
這是一條 critical 日志信息.
創建日志處理程序并配置輸出格式
日志處理程序是 logging
模塊用于處理和輸出日志消息的組件.我們可以為日志記錄器添加一個或多個處理程序, 以決定日志消息的輸出位置.
# 輸出到控制臺.
handler = logging.StreamHandler()
# 配置輸出格式
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
handler.setFormatter(formatter)
將處理程序添加到日志記錄器.
logger.addHandler(handler)
將日志內容輸出到控制臺
import logging# 創建日志記錄器.
logger = logging.getLogger('my_logger')
# 設置日志記錄的級別
logger.setLevel(logging.INFO)
# 輸出到控制臺. 創建一個日志處理程序.
handler = logging.StreamHandler()
# 設置日志處理器級別 - 程序中設置的日志級別必須不低于日志處理器級別才能記錄
handler.setLevel(logging.INFO)
# 配置日志輸出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 將輸出的格式添加到handler里面來.
handler.setFormatter(formatter)
# 將日志處理程序添加到logger.
logger.addHandler(handler)logger.debug(f'這是一條 debug 日志信息.')
logger.info(f'這是一條 info 日志信息.')
logger.warning(f'這是一條 warning 日志信息.')
logger.error(f'這是一條 error 日志信息.')
logger.critical(f'這是一條 critical 日志信息.')# 顯示如下內容:[my_logger] 2025-03-23 15:38:52,264 [INFO] 這是一條 info 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [WARNING] 這是一條 warning 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [ERROR] 這是一條 error 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [CRITICAL] 這是一條 critical 日志信息.
將日志寫入到文件
要將日志寫入到文件只需要將創建日志處理程序的StreamHandler更換為FileHandler
file_handler = logging.FileHandler('my_logger.log')
將日志記錄內容既輸出到控制臺又輸出到文件中:
import logging# 創建日志記錄器.
# logging.basicConfig()
logger = logging.getLogger(__name__)
# 設置日志記錄的級別
logger.setLevel(logging.INFO)
# 輸出到控制臺. 創建一個日志處理程序.
handler = logging.StreamHandler()
file_handler = logging.FileHandler('my_logger.log', encoding='utf8')
# 配置日志輸出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 將輸出的格式添加到handler里面來.
handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 將日志處理程序添加到logger.
logger.addHandler(handler)
logger.addHandler(file_handler)logger.debug(f'這是一條 debug 日志信息.')
logger.info(f'這是一條 info 日志信息.')
logger.warning(f'這是一條 warning 日志信息.')
logger.error(f'這是一條 error 日志信息.')
logger.critical(f'這是一條 critical 日志信息.')
如果僅僅想讓日志內容輸出到文件中, 可以把之前創建的輸出到控制臺的handler刪除(只保留輸出到文件中的handler)即可:
import logging# 創建日志記錄器.
# logging.basicConfig()
logger = logging.getLogger(__name__)
# 設置日志記錄的級別
logger.setLevel(logging.INFO)
# 輸出到控制臺. 創建一個日志處理程序.
file_handler = logging.FileHandler('my_logger.log', encoding='utf8')
# 配置日志輸出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 將輸出的格式添加到handler里面來.
file_handler.setFormatter(formatter)
# 將日志處理程序添加到logger.
logger.addHandler(file_handler)logger.debug(f'這是一條 debug 日志信息.')
logger.info(f'這是一條 info 日志信息.')
logger.warning(f'這是一條 warning 日志信息.')
logger.error(f'這是一條 error 日志信息.')
logger.critical(f'這是一條 critical 日志信息.')
logging更簡單的一種使用方式
這種使用方式較上面的使用方式更簡單:
logging.basicConfig(level=logging.DEBUG,format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',)
logger = logging.getLogger('my_name')
import logginglogging.basicConfig(level=logging.INFO,format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',handlers=[logging.StreamHandler(),logging.FileHandler('my_logger.log', encoding='utf8')]
)
logger = logging.getLogger('my_name')# 模擬用戶名校驗.
def check_username(username):"""1. 長度不能小于5.2. 只能包含字符.3. 禁止使用系統用戶名. admin, root.:param username: 傳入的用戶名.:return: None."""logger.debug(f'正在備校驗{username}')if username in ['admin', 'root']:raise ValueError('禁止使用系統用戶名')if len(username) < 5:raise ValueError('用戶名長度小于5')if not username.isalpha():raise ValueError('用戶名只能包含字符')# 如果上面的3個判斷都沒進, 就會走到這里.logger.info(f'{username}校驗成功.')try:username = input("請輸入用戶名:")logger.debug(f'準備校驗{username}')check_username(username)
except ValueError as e:# 此處username發出黃色警告, 我在視頻中是故意不講的, 因為已經講過很多次了.# 希望大家自己動手解決一下此處username發出黃色警告的問題.logger.error(f'用戶名{username}校驗失敗: 失敗原因{e}')
|
|