# Python中怎么記錄程序日志
## 引言
在軟件開發過程中,日志記錄是至關重要的環節。良好的日志系統能幫助開發者快速定位問題、監控程序運行狀態以及分析用戶行為。Python作為一門廣泛使用的高級編程語言,提供了多種靈活的日志記錄方案。本文將詳細介紹Python中的日志記錄方法,包括內置`logging`模塊的使用、第三方庫的選擇以及最佳實踐。
---
## 一、為什么需要記錄日志
1. **問題診斷**:當程序出現異常時,日志能提供關鍵的錯誤上下文
2. **運行監控**:通過日志分析系統運行狀態和性能指標
3. **審計追蹤**:滿足合規要求,記錄關鍵操作的歷史軌跡
4. **數據分析**:用戶行為日志可用于后續業務分析
---
## 二、Python內置logging模塊
### 2.1 基本使用方法
```python
import logging
# 基礎配置
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)
# 記錄不同級別日志
logging.debug('調試信息')
logging.info('常規信息')
logging.warning('警告信息')
logging.error('錯誤信息')
logging.critical('嚴重錯誤')
級別 | 數值 | 使用場景 |
---|---|---|
DEBUG | 10 | 開發調試細節 |
INFO | 20 | 程序正常運行信息 |
WARNING | 30 | 潛在問題警告 |
ERROR | 40 | 功能錯誤 |
CRITICAL | 50 | 系統級嚴重錯誤 |
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)
# 創建處理器
console_handler = logging.StreamHandler()
file_handler = RotatingFileHandler(
'app.log', maxBytes=1024*1024, backupCount=5
)
# 設置格式
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加處理器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
現代日志系統推薦使用結構化格式(如JSON)以便后續處理:
import logging
import json
from pythonjsonlogger import jsonlogger
logger = logging.getLogger()
formatter = jsonlogger.JsonFormatter(
'%(asctime)s %(name)s %(levelname)s %(message)s'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('用戶登錄', extra={
'user_id': 12345,
'ip': '192.168.1.1',
'browser': 'Chrome'
})
from loguru import logger
logger.add("file_{time}.log", rotation="500 MB")
logger.debug("優雅的日志記錄")
logger.error("自動包含堆棧信息")
優點: - 更簡單的API - 自動日志文件輪轉 - 更好的異常處理
import structlog
structlog.configure(
processors=[
structlog.processors.JSONRenderer()
]
)
log = structlog.get_logger()
log.info("用戶操作", action="click", item_id=42)
特點: - 專注于結構化日志 - 靈活的處理器管道
isEnabledFor
檢查級別if logger.isEnabledFor(logging.DEBUG):
logger.debug(f"耗時操作: {expensive_function()}")
在微服務架構中,建議: 1. 使用ELK棧(Elasticsearch+Logstash+Kibana) 2. 或采用Fluentd/Loki等現代日志收集系統 3. 為每個請求添加唯一追蹤ID
import uuid
from flask import g
@app.before_request
def set_request_id():
g.request_id = uuid.uuid4().hex
logger.info("請求開始", request_id=g.request_id)
# 主模塊
logger = logging.getLogger(__name__)
# 子模塊
module_logger = logging.getLogger(__name__ + '.submodule')
import sys
def handle_exception(exc_type, exc_value, exc_traceback):
logger.critical("未捕獲異常",
exc_info=(exc_type, exc_value, exc_traceback))
sys.excepthook = handle_exception
# settings.py
LOGGING = {
'version': 1,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'django.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
},
},
}
良好的日志實踐是專業開發的重要標志。Python提供了從簡單到復雜的多種日志解決方案,開發者應根據項目規模和要求選擇合適的方案。記?。喝罩静皇窃蕉嘣胶?,而是要有價值、可操作且高效。
提示:定期審查日志配置,刪除不再需要的調試日志,保持日志系統的整潔和有效。 “`
本文約1550字,涵蓋了Python日志記錄的各個方面,包括基礎使用、高級技巧和最佳實踐,采用Markdown格式編寫,可直接用于技術文檔或博客發布。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。