以下是一个Python实现的服务器日志监控脚本,当检测到错误日志时自动发送短信通知。使用Twilio作为短信服务提供商(需先注册账号获取凭证):
import time
import logging
from twilio.rest import Client
# 配置日志文件路径
LOG_FILE = "/var/log/nginx/error.log"
# Twilio配置(从环境变量获取更安全)
ACCOUNT_SID = "your_account_sid"
AUTH_TOKEN = "your_auth_token"
FROM_NUMBER = "+1234567890" # 你的Twilio号码
TO_NUMBER = "+0987654321" # 接收通知的号码
# 初始化Twilio客户端
client = Client(ACCOUNT_SID, AUTH_TOKEN)
def send_sms_alert(log_entry):
"""发送短信通知"""
try:
message = client.messages.create(
body=f"🚨 服务器错误告警: {log_entry[:160]}...", # 截取前160字符
from_=FROM_NUMBER,
to=TO_NUMBER
)
logging.info(f"短信已发送: {message.sid}")
except Exception as e:
logging.error(f"短信发送失败: {str(e)}")
def monitor_logs():
"""监控日志文件变化"""
last_position = 0
while True:
try:
with open(LOG_FILE, 'r') as f:
# 定位到上次读取位置
f.seek(last_position)
new_lines = f.readlines()
last_position = f.tell()
for line in new_lines:
if "ERROR" in line or "500" in line: # 检测错误关键词
logging.warning(f"检测到错误日志: {line.strip()}")
send_sms_alert(line.strip())
except FileNotFoundError:
logging.error("日志文件不存在")
except Exception as e:
logging.error(f"监控异常: {str(e)}")
time.sleep(60) # 每60秒检查一次
if __name__ == "__main__":
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
monitor_logs()
使用说明:
-
前置要求:
- 安装依赖:
pip install twilio
- 注册Twilio获取
ACCOUNT_SID
和AUTH_TOKEN
- 申请Twilio电话号码(
FROM_NUMBER
)
- 安装依赖:
-
功能特点:
- 实时监控日志文件变化
- 当出现"ERROR"或"500"等关键词时触发通知
- 短信内容自动截断适配SMS长度限制
- 内置异常处理和日志记录
-
部署建议:
-
使用
systemd
创建守护进程 -
通过环境变量配置敏感信息:
export TWILIO_ACCOUNT_SID="your_sid" export TWILIO_AUTH_TOKEN="your_token"
-
修改代码中的关键词检测逻辑适配具体日志格式
-
-
安全提示:
- 不要将凭证直接写在代码中
- 限制接收号码为管理员号码
- 添加频率限制防止短信轰炸
注意:实际使用时需替换配置参数,并根据服务器日志格式调整错误检测逻辑。对于生产环境,建议添加日志轮转(rotation)处理机制。