前言服务器运行过程中磁盘空间不足、程序连接失败或者服务异常通常都会在系统日志或应用日志中留下记录。但如果没有专门的监控工具这些信息往往要等到人工登录服务器检查时才会被发现。对于家庭服务器、测试主机和数量不多的小型服务来说部署一套完整的日志平台可能有些复杂。更直接的办法是持续读取关键日志文件在出现error、failed或者no space left on device等指定关键词时主动发送一条告警消息。本文会使用Python编写一个轻量日志监控脚本记录当前读取位置只处理后续新增的日志内容并在匹配到异常关键词后通过钉钉机器人将主机名、时间、日志路径和具体内容发送到群聊。完成日志告警后还会将脚本配置为systemd服务使其能够随系统启动并持续运行。最后通过cpolar映射服务器的SSH端口收到告警后可以从外部网络远程登录主机继续检查磁盘、进程和服务状态。1.测试效果效果预览当你的/var/log/syslog或应用日志中出现May 0815:30:01 server cpolar[1234]: Failed towritelog: no space left on device你将在钉钉群收到如下消息【服务器告警】主机Z4S-VJFL时间2026-05-08 15:30:01日志路径/var/log/cpolar/access.log.20260508内容Failed to write log: no space left on device磁盘空间不足请立即处理通过这个Python脚本你实现了实时监控任意日志文件关键词触发精准告警钉钉消息秒级触达手机低资源占用适合嵌入式设备零依赖复杂框架纯标准库 requests延伸场景监控Nginx错误日志 → 发现攻击行为监控数据库慢查询日志 → 优化SQL监控Docker容器日志 → 异常自动重启让机器替你“盯屏”你只管睡觉2.获取钉钉Webhook和Secret打开钉钉群 → 点击右上角设置找到智能群助手 → 添加机器人添加自定义机器人点击添加给机器人起个名字我这里是“服务器告警”设置发消息关键词因为现在钉钉对安全严格所以需要设置限制也可以设置加签或者IP地址点击“加签”复制生成的秘钥留着备用点击完成后复制生成的Webhook留着备用3.编写Python监控脚本创建要监控的日志文件mkdir/var/log/ceshi/touch/var/log/ceshi/access.log.20260508创建文件log_monitor.py#!/usr/bin/env python3# -*- coding: utf-8 -*-importosimporttimeimportjsonimporthmacimporthashlibimportbase64importurllib.parse from datetimeimportdatetime from pathlibimportPathimportrequests# 配置区请按需修改LOG_FILE/var/log/ceshi/access.log.20260508# 要监控的日志文件KEYWORDS[error,failed,exception,no space left on device,disk full]HOSTNAMEos.uname().nodename# 自动获取主机名# 钉钉机器人配置从钉钉后台获取DINGTALK_WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_tokendbf63c2e3c2f2ddDINGTALK_SECRETSEC8bb4d908c1039a4# 钉钉签名函数 def get_dingtalk_sign(): timestampstr(round(time.time()*1000))secret_encDINGTALK_SECRET.encode(utf-8)string_to_sign{}\n{}.format(timestamp, DINGTALK_SECRET)string_to_sign_encstring_to_sign.encode(utf-8)hmac_codehmac.new(secret_enc, string_to_sign_enc,digestmodhashlib.sha256).digest()signurllib.parse.quote_plus(base64.b64encode(hmac_code))returntimestamp, sign# 发送钉钉消息 def send_dingtalk_alert(message): timestamp, signget_dingtalk_sign()webhook_urlf{DINGTALK_WEBHOOK}×tamp{timestamp}sign{sign}data{msgtype:markdown,markdown:{title:【服务器告警】,text:message}}try: responserequests.post(webhook_url,jsondata,timeout10)ifresponse.status_code!200: print(f[!] 钉钉发送失败: {response.text})except Exception as e: print(f[!] 钉钉请求异常: {e})# 监控日志主函数 def monitor_log(): log_pathPath(LOG_FILE)ifnot log_path.exists(): print(f[!] 日志文件不存在: {LOG_FILE})return# 获取文件初始大小用于断点续读file_sizelog_path.stat().st_size print(f[] 开始监控日志: {LOG_FILE} (初始大小: {file_size} bytes))whileTrue: try: current_sizelog_path.stat().st_sizeifcurrent_sizefile_size:# 日志被轮转如 logrotate重置位置print([] 检测到日志轮转重新开始读取)file_size0ifcurrent_sizefile_size: with open(LOG_FILE,r,encodingutf-8,errorsignore)as f: f.seek(file_size)# 从上次位置读起linesf.readlines()file_sizecurrent_size# 更新已读位置forlineinlines: line_lowerline.lower()forkeywordinKEYWORDS:ifkeywordinline_lower:# 构建告警消息nowdatetime.now().strftime(%Y-%m-%d %H:%M:%S)msg(f## **【服务器告警】**\n\nf- **主机**:{HOSTNAME}\nf- **时间**:{now}\nf- **日志路径**:{LOG_FILE}\nf- **内容**:{line.strip()}\n\nf ⚠️ **检测到关键词:{keyword}**)print(f[ALERT] {line.strip()})send_dingtalk_alert(msg)break# 避免重复告警同一行time.sleep(1)# 每秒检查一次except KeyboardInterrupt: print(\n[] 监控已停止)breakexcept Exception as e: print(f[!] 监控异常: {e})time.sleep(5)if__name____main__:monitor_log()4.安装依赖 赋予执行权限进入你的项目目录:cd/root/ceshi创建虚拟环境Python 3.6 自带 venvpython3-mvenv venv激活虚拟环境:sourcevenv/bin/activate此时提示符会变成 (venv)再安装包pipinstallrequests5.测试运行运行你的脚本python log_monitor.py编辑/var/log/ceshi/access.log.20260508监控文件viaccess.log.20260508May 0815:30:01 server cpolar[1234]: Failed towritelog: no space left on device钉钉成功发送告警6.运行 开机自启方式 1使用nohup临时运行nohuppython3 /path/to/log_monitor.py/var/log/log_monitor.log21方式 2创建systemd服务推荐支持开机自启创建服务文件sudovim/etc/systemd/system/log-monitor.service[Unit]DescriptionLog MonitorforServer AlertsAfternetwork.target[Service]TypesimpleUserrootExecStart/usr/bin/python3 /ceshi/log_monitor.pyRestartalwaysRestartSec10[Install]WantedBymulti-user.target启动服务sudosystemctl daemon-reloadsudosystemctlenable--nowlog-monitor.servicesudosystemctl status log-monitor在现实运维中很多开发者、创客甚至中小企业都把关键服务部署在家庭NAS、老旧服务器或内网测试机上——它们没有固定公网IP藏在路由器后面平时靠cpolar暴露个Web界面勉强够用。可一旦半夜磁盘爆满、Docker容器崩溃、系统日志里刷出“no space left on device”或“cpolar failed to reconnect”你却远在千里之外出差、旅游甚至正在熟睡。这时候人工巡检毫无意义而商业监控平台又太重、太贵。但如果你提前做了两件事第一在服务器上跑一个轻量Python脚本持续扫描/var/log/cpolar/或系统日志一旦发现关键词就通过钉钉机器人推送告警到手机第二用cpolar配置一条TCP隧道把本地22端口SSH映射到公网哪怕只是临时分配的地址。那么当故障发生时你的手机会立刻收到钉钉消息“【告警Z4S主机磁盘已满建议通过 cpolar SSH登录清理”。你只需打开终端输入ssh -p 22222 root192.xxx.xxx.xxx就能像坐在机器前一样删日志、重启服务、查进程——整个过程不到五分钟无需回家不用求人。这不仅是技术组合更是对“运维最后一公里”的真实补全让每一台沉默的内网设备都能在危急时刻主动呼救并为你留一扇随时可进的门。尤其对于用极空间、树莓派、旧笔记本搭建家庭实验室的人来说这套方案成本近乎为零却能极大提升系统的可靠性和你的安心感。7.安装cpolar实现随时随地开发7.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。7.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。8.配置公网地址通过配置你可以在本地WSL或Linux系统上运行SSH服务并通过Cpolar将其映射到公网从而实现从任意设备远程连接开发环境的目的。隧道名称可自定义本例使用了:ssh注意不要与已有的隧道名称重复协议tcp本地地址22端口类型随机临时TCP端口地区China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用任意一个地址在终端中访问即可。tcp 表示使用的协议类型2.tcp.cpolar.top是 Cpolar 提供的域名12178是随机分配的公网端口号通过Cpolar提供的公网地址和端口就可以进行远程部署啦ssh-p12178root2.tcp.cpolar.top9.保留固定TCP公网地址使用cpolar为其配置TCP地址该地址为固定地址不会随机变化。选择区域和描述有一个下拉菜单当前选择的是“China VIP”。右侧输入框用于填写描述信息。保留按钮在右侧有一个橙色的“保留”按钮点击该按钮可以保留所选的TCP地址。列表中显示了一条已保留的TCP地址记录。地区显示为“China Top”。地址显示为“ 16.tcp.cpolar.top:14775”。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道ssh点击右侧的编辑。修改隧道信息将保留成功的TCP端口配置到隧道中。端口类型选择固定TCP端口预留的TCP地址填写保留成功的TCP地址点击更新。创建完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的TCP地址。这样我们连接到目标主机就没有任何的阻碍啦总结完成以上配置后Python脚本就可以持续检查指定日志文件中新增加的内容。当某一行包含预设关键词时程序会整理当前主机、触发时间、日志路径和具体内容并通过钉钉机器人发送到群聊中。将脚本配置为systemd服务后不需要每次重启服务器都重新手动运行。服务意外退出时也可以根据配置自动重启更适合作为长期运行的基础日志提醒工具。通过cpolar将SSH端口映射为公网TCP地址后收到钉钉告警时还可以从其他网络环境远程登录服务器继续查看磁盘使用情况、相关进程和服务日志。配置固定TCP地址后远程入口不会随着临时隧道变化。需要注意的是这套方案本质上是基于关键词匹配的轻量告警脚本只能发现已经写入指定日志文件、并且符合预设关键词的异常。正式使用时应根据不同服务调整日志路径和关键词同时增加告警去重、频率限制、状态记录和日志轮转处理避免同类错误持续出现时重复发送大量通知。