Python記錄日志的完整指南
一、為什么需要日志記錄?
- 問題定位:記錄程序運(yùn)行時(shí)狀態(tài),快速定位異常
- 性能監(jiān)控:跟蹤關(guān)鍵業(yè)務(wù)指標(biāo)(如API請求耗時(shí))
- 審計(jì)追蹤:記錄用戶操作和系統(tǒng)變更
- 調(diào)試輔助:比
print()更靈活可控的調(diào)試方式
二、基礎(chǔ)使用:5分鐘快速上手
import logging
# 創(chuàng)建基礎(chǔ)配置
logging.basicConfig(
level=logging.INFO, # 設(shè)置日志級別
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(), # 輸出到控制臺
logging.FileHandler('app.log') # 輸出到文件
]
)
# 創(chuàng)建記錄器
logger = logging.getLogger('my_app')
# 記錄不同級別的日志
logger.debug('調(diào)試信息')
logger.info('程序正常啟動(dòng)')
logger.warning('磁盤空間不足')
logger.error('數(shù)據(jù)庫連接失敗')
logger.critical('系統(tǒng)崩潰')
三、核心組件深度解析
日志級別(從低到高)
- DEBUG:詳細(xì)調(diào)試信息
- INFO:常規(guī)操作記錄
- WARNING:潛在問題提醒
- ERROR:運(yùn)行時(shí)錯(cuò)誤
- CRITICAL:嚴(yán)重錯(cuò)誤導(dǎo)致程序中止
五大核心組件

配置方式對比
| 配置方式 | 適用場景 | 優(yōu)點(diǎn) |
|---|---|---|
| basicConfig() | 簡單腳本/快速原型 | 一行代碼完成基礎(chǔ)配置 |
| 代碼配置 | 中小型項(xiàng)目 | 靈活可控 |
| 配置文件 | 大型項(xiàng)目/團(tuán)隊(duì)協(xié)作 | 分離配置與代碼 |
| 字典配置 | 動(dòng)態(tài)配置/12因子應(yīng)用 | 兼容環(huán)境變量 |
四、高級用法與最佳實(shí)踐
1. 日志輪轉(zhuǎn)(避免日志文件過大)
from logging.handlers import RotatingFileHandler
# 每個(gè)文件10MB,保留3個(gè)備份
handler = RotatingFileHandler(
'app.log',
maxBytes=10*1024*1024,
backupCount=3
)
logger.addHandler(handler)
2. 異步日志(提升性能)
from logging.handlers import QueueHandler, QueueListener import queue import threading log_queue = queue.Queue(-1) listener = QueueListener(log_queue, *logger.handlers) listener.start() logger.addHandler(QueueHandler(log_queue))
3. 上下文信息記錄(如請求ID)
from logging import LoggerAdapter
class RequestContext:
def __init__(self, request_id):
self.request_id = request_id
adapter = LoggerAdapter(logger, {'request_id': 'REQ123'})
adapter.info('處理用戶請求')
# 輸出:[2025-09-04 10:00:00] - my_app - INFO - REQ123 - 處理用戶請求
4. 敏感信息過濾
class SensitiveFilter:
def filter(self, record):
msg = record.msg
# 替換敏感信息(如密碼)
msg = msg.replace('password=123456', 'password=******')
record.msg = msg
return True
logger.addFilter(SensitiveFilter())
五、常見問題解決方案
1. 日志重復(fù)記錄問題
- 原因:多次調(diào)用
getLogger()導(dǎo)致重復(fù)添加Handler - 解決:使用
__name__作為日志器名稱,確保單例模式
2. 多線程日志安全
- 問題:多線程下日志順序錯(cuò)亂
- 解決:使用
logging內(nèi)置線程鎖(默認(rèn)已處理),或改用異步日志
3. 日志文件權(quán)限問題
- 問題:Linux下普通用戶無法寫入日志文件
- 解決:創(chuàng)建專用日志目錄并設(shè)置權(quán)限
mkdir /var/log/myapp chmod 775 /var/log/myapp chown -R appuser:appgroup /var/log/myapp
六、企業(yè)級日志架構(gòu)建議
日志分級策略
- DEBUG:本地開發(fā)環(huán)境
- INFO:預(yù)生產(chǎn)環(huán)境
- WARNING及以上:生產(chǎn)環(huán)境
集中化日志管理
- 使用ELK(Elasticsearch+Logstash+Kibana)或Sentry
- 配置日志采集代理(如Filebeat)
日志格式規(guī)范
- 推薦JSON格式(便于解析)
- 包含關(guān)鍵字段:時(shí)間戳、日志級別、類名、方法名、消息、線程ID
結(jié)語
掌握Python日志記錄不僅是開發(fā)的基本功,更是構(gòu)建可維護(hù)、可觀測系統(tǒng)的基石。從簡單的print()替換開始,逐步掌握格式化、處理器配置、日志輪轉(zhuǎn)等高級技巧,最終構(gòu)建符合企業(yè)級標(biāo)準(zhǔn)的日志系統(tǒng)。
最佳實(shí)踐建議:
- 始終使用
logging模塊代替print() - 生產(chǎn)環(huán)境至少配置兩個(gè)Handler(控制臺+文件)
- 敏感信息必須脫敏處理
- 定期審查日志策略(建議每季度)
通過本文的系統(tǒng)講解和代碼示例,相信你已經(jīng)具備設(shè)計(jì)專業(yè)日志系統(tǒng)的能力。立即在項(xiàng)目中實(shí)踐這些技巧,讓你的Python應(yīng)用具備工業(yè)級的可觀測性吧!
到此這篇關(guān)于Python記錄日志的完整指南的文章就介紹到這了,更多相關(guān)Python記錄日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python實(shí)現(xiàn)劉謙春晚魔術(shù)
pytorch torch.gather函數(shù)的使用
Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的區(qū)別
詳解利用Python scipy.signal.filtfilt() 實(shí)現(xiàn)信號濾波
解決更改AUTH_USER_MODEL后出現(xiàn)的問題
Pyecharts 中Geo函數(shù)常用參數(shù)的用法說明

