Python记录日志报警详解
目录
- 方案 1:简单日志告警(推荐基础方案)
- 方案 2:邮件告警(需 SMTP 服务)
- 方案 编程3:Slack 通知(推荐团队协作)
- 方案 4:桌面弹窗通知(适合本地开发)
- 最佳实践建议
- 完整示例代码
- 选择依据
- 总结
在 python 标准库中,可以列举出如下常见场景日志报警解决方案:
方案 1:简单日志告警(推荐基础方案)
import logging def send_alert(message): logging.error(f"ALERT: {mejavascriptssage}") # 可扩展:同时写入文件/发送到日志服务器 # 配置日志格式 logging.basicConfig( level=loggi编程客栈ng.ERROR, format='%(ascjavascripttime)s - %(levelname)s - %(message)s' )
✅ 无需额外安装包,适合本地开发或简单场景
方案 2:邮件告警(需 SMTP 服务)
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") python # 从.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 内置 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 通知(推荐团队协作)
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 创建 Incoming Webhook
- 在
.env
添加:
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXXX/YYYY
方案 4:桌面弹窗通知(适合本地开发)
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
最佳实践建议
多通道组合
def send_alert(message): logging.error(message) # 基础日志 send_to_slack_async(message) # 异步非阻塞通知团队
异步处理
使用 threading
避免阻塞主程序:
import threading def async_alert(message): threading.Thread(target=send_alert, args=(message,)).start()
敏感信息加密
对邮件/Slack 的凭据使用加密存储:
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 # 加载环境变量 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文件!")
选择依据
方案 | 适用场景 | 可靠性 | 复杂度 |
---|---|---|---|
日志 | 开发环境/简单生产环境 | 高 | 低 |
邮件 | 需要邮件通知的生产环境 | 中 | 中 |
Slack | 团队协作环境 | 高 | 中 |
桌面弹窗 | 本地开发环境 | 低 | 低 |
组合方案 | 关键业务系统 | 最高 | 高 |
根据实际需求选择,建议至少实现日志告警 + 一种主动通知方式。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论