Python記錄日志報(bào)警詳解
在 Python 標(biāo)準(zhǔn)庫中,可以列舉出如下常見場景日志報(bào)警解決方案:
方案 1:簡單日志告警(推薦基礎(chǔ)方案)
import logging
def send_alert(message):
logging.error(f"ALERT: {message}")
# 可擴(kuò)展:同時(shí)寫入文件/發(fā)送到日志服務(wù)器
# 配置日志格式
logging.basicConfig(
level=logging.ERROR,
format='%(asctime)s - %(levelname)s - %(message)s'
)
? 無需額外安裝包,適合本地開發(fā)或簡單場景
方案 2:郵件告警(需 SMTP 服務(wù))
import smtplib
from email.mime.text import MIMEText
from os import getenv
def send_alert(message):
msg = MIMEText(message)
msg["Subject"] = "API Key 異常告警"
msg["From"] = getenv("ALERT_EMAIL_FROM") # 從.env讀取
msg["To"] = getenv("ALERT_EMAIL_TO")
with smtplib.SMTP_SSL(getenv("SMTP_SERVER"), 465) as server:
server.login(getenv("SMTP_USER"), getenv("SMTP_PASSWORD"))
server.send_message(msg)
依賴包:Python 內(nèi)置 smtplib + email
需在 .env 中配置:
SMTP_SERVER=smtp.example.com SMTP_USER=alert@example.com SMTP_PASSWORD=your_email_password ALERT_EMAIL_FROM=alert@example.com ALERT_EMAIL_TO=devops@example.com
方案 3:Slack 通知(推薦團(tuán)隊(duì)協(xié)作)
import requests
from os import getenv
def send_alert(message):
webhook_url = getenv("SLACK_WEBHOOK_URL")
payload = {"text": f"?? 告警: {message}"}
requests.post(webhook_url, json=payload)
依賴包:需安裝 requests
配置步驟:
- 在 Slack 創(chuàng)建 Incoming Webhook
- 在
.env添加:
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXXX/YYYY
方案 4:桌面彈窗通知(適合本地開發(fā))
from plyer import notification
import sys
def send_alert(message):
if sys.platform in ["win32", "darwin", "linux"]:
notification.notify(
title="密鑰異常",
message=message,
app_icon=None,
timeout=10
)
依賴包:需安裝 plyer
pip install plyer
最佳實(shí)踐建議
多通道組合
def send_alert(message):
logging.error(message) # 基礎(chǔ)日志
send_to_slack_async(message) # 異步非阻塞通知團(tuán)隊(duì)
異步處理
使用 threading 避免阻塞主程序:
import threading
def async_alert(message):
threading.Thread(target=send_alert, args=(message,)).start()
敏感信息加密
對郵件/Slack 的憑據(jù)使用加密存儲:
from cryptography.fernet import Fernet # 加密 cipher = Fernet(key) encrypted = cipher.encrypt(b"secret_password") # 解密 cipher.decrypt(encrypted)
完整示例代碼
import os
import logging
from dotenv import load_dotenv
from threading import Thread
import requests
# 加載環(huán)境變量
load_dotenv()
# 配置日志
logging.basicConfig(
level=logging.ERROR,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def send_alert(message):
"""多通道告警"""
# 1. 本地日志
logging.error(message)
# 2. 異步Slack通知
def _slack_alert(msg):
try:
webhook = os.getenv("SLACK_WEBHOOK")
requests.post(webhook, json={"text": msg}, timeout=3)
except Exception as e:
logging.error(f"Slack通知失敗: {str(e)}")
Thread(target=_slack_alert, args=(message,)).start()
# 使用示例
try:
api_key = os.environ["API_KEY"]
except KeyError:
send_alert("API_KEY 缺失!立即更新.env文件!")
選擇依據(jù)
| 方案 | 適用場景 | 可靠性 | 復(fù)雜度 |
|---|---|---|---|
| 日志 | 開發(fā)環(huán)境/簡單生產(chǎn)環(huán)境 | 高 | 低 |
| 郵件 | 需要郵件通知的生產(chǎn)環(huán)境 | 中 | 中 |
| Slack | 團(tuán)隊(duì)協(xié)作環(huán)境 | 高 | 中 |
| 桌面彈窗 | 本地開發(fā)環(huán)境 | 低 | 低 |
| 組合方案 | 關(guān)鍵業(yè)務(wù)系統(tǒng) | 最高 | 高 |
根據(jù)實(shí)際需求選擇,建議至少實(shí)現(xiàn)日志告警 + 一種主動通知方式。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程
WTForms由Python寫成,為表單而生,提供了很多制作Web表單的實(shí)用API,和Flask框架結(jié)合使用效果拔群,這里我們就一起看一下在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程2016-06-06
使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程
今天小編就為大家分享一篇使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

