--- noteId: "ebeab860234511f1b8139f50f0306497" tags: [] --- # 13 funweb (funboost web manager) 介绍 - 术语说明:funweb 是 funboost_web_manager 的简称。 - 通过 funweb 可以查看消费结果;管理队列;管理消费者;查看正在运行的函数; 实时调节并发数量;调节 qps 限制频率;仅从页面就能看到python 函数的消费情况,无需去查看日志文件。 - 说明:funweb 不一定需要用户安装mongo,用户只要不使用前2个页面就好了,后几个页面都是依赖redis,不依赖mongo. ## 13.1 介绍 启动 funweb (funboost web manager) (方式一)。 funweb 启动方式很容易很简单,一键就能启动。 python3 -m funboost.funweb.app web代码在funboost安装包里面,所以你安装了funboost后,可以直接使用命令行运行起来,不需要用户现亲自下载web代码就可以直接一键启动运行。
首先要安装选装 pip install funboost[flask]
(这是因为这是选装,防止用户抱怨funboost依赖太多。) ``` 第一步:设置 PYTHONPATH 为你的项目根目录 export PYTHONPATH=你的项目根目录 (这么做是为了这个web可以读取到你项目根目录下的 funboost_config.py里面的配置) (怎么设置环境变量应该不需要我来教,环境变量都没听说过太low了) 例如 export PYTHONPATH=/home/ydf/codes/ydfhome 或者 export PYTHONPATH=./ (./是相对路径,前提是已近cd到你的项目根目录了,也可以写绝对路径全路径) win cmd 设置环境变量语法是 set PYTHONPATH=/home/ydf/codes/ydfhome win powershell 语法是 $env:PYTHONPATH = "/home/ydf/codes/ydfhome" 第二步:启动 funweb 的 flask app win上这么做: python3 -m funboost.funweb.app linux上可以这么做性能好一些,也可以按win的做: gunicorn -w 4 --threads=30 --bind 0.0.0.0:27018 funboost.funweb.app:app ``` 使用浏览器打开 127.0.0.1(启动web服务的机器ip):27018,输入默认用户名 密码 admin 123456,即可打开函数运行状态和结果页面。 ### 13.1.b 直接在代码中启动web start_funboost_web_manager() (方式二): start_funboost_web_manager() 可以随着消费程序一起启动,也可以单独启动。 ```python from funboost.funweb.app import start_funboost_web_manager start_funboost_web_manager() ``` ## 13.2 funweb 截图 设置关心的项目,设置 care_project_name,可以让界面仅显示你关心的项目的队列,减少无关返回信息的干扰。 [](https://imgchr.com/i/pZ10fnf) 函数消费结果:可查看和搜索函数实时消费状态和结果。对于失败的消息,在页面上用户可以点击重新运行按钮,方便一键重新投递到消息队列。 [](https://imgchr.com/i/pZ1L5h4) 消费速度图:可查看实时和历史消费速度 [](https://imgchr.com/i/pZ10g1I) 运行中消费者 by ip: 根据ip搜索有哪些消费者 [](https://imgchr.com/i/pZlrwsP) 运行中消费者 by queue: 根据队列名字搜索有哪些消费者 [](https://imgchr.com/i/pZ10c9A) 队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发 [](https://imgchr.com/i/pZlrYPH) [](https://imgchr.com/i/pZlrUxI) 队列操作,查看消费者详情:查看队列的所有消费者详情 [](https://imgchr.com/i/pZlr8aD) 队列操作,查看消费者的BoosterParams配置 [](https://imgchr.com/i/pZlrdMt) 队列操作:查看消费曲线图,查看各种消费指标。 包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量 [](https://imgchr.com/i/pZ104HS) rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;以及可根据taskid获取结果。 [](https://imgchr.com/i/pZ10RjP) [](https://imgchr.com/i/pZ102ct) 定时任务管理:列表页 [] 定时任务:新增 [](https://imgchr.com/i/pZlrGIe) 定时任务:任务详情 [](https://imgchr.com/i/pZ10hB8) ## 13.3 funboost web 图片对应的测试代码 ```python import asyncio import time import random from funboost import boost, FunctionResultStatusPersistanceConfig, BoosterParams,BrokerEnum,ctrl_c_recv,ConcurrentModeEnum from funboost.funweb.app import start_funboost_web_manager class MyBoosterParams(BoosterParams): project_name:str = 'test_project1' # 核心配置,项目名,设置后,web接口就可以只关心某个项目下的队列,减少无关返回信息的干扰。 broker_kind:str = BrokerEnum.REDIS is_send_consumer_heartbeat_to_redis : bool= True # 向redis发送心跳,这样才能从redis获取相关队列的运行信息。 is_using_rpc_mode:bool = True # 必须设置这一个参数为True,才能支持rpc功能。 booster_group : str = 'test_group1' # 方便按分组启动消费 should_check_publish_func_params:bool = True # 发布消息时,是否检查消息内容是否正确,不正确的消息格式立刻从接口返回报错消息内容不正确。 function_result_status_persistance_conf: FunctionResultStatusPersistanceConfig = FunctionResultStatusPersistanceConfig( is_save_result=True, is_save_status=True, expire_seconds=7 * 24 * 3600, is_use_bulk_insert=False) @boost(MyBoosterParams(queue_name='queue_test_g01t',qps=1,)) def f(x): time.sleep(5) print(f'hi: {x}') if random.random() > 0.9: raise ValueError('f error') return x + 1 @boost(MyBoosterParams(queue_name='queue_test_g02t',qps=0.5, max_retry_times=0,)) def f2(x,y): time.sleep(2) print(f'hello: {x} {y}') if random.random() > 0.5: raise ValueError('f2 error') return x + y @boost(MyBoosterParams(queue_name='queue_test_g03t',qps=0.5, max_retry_times=0,concurrent_mode=ConcurrentModeEnum.ASYNC)) async def aio_f3(x): await asyncio.sleep(3) print(f'f3aa: {x}') if random.random() > 0.5: raise ValueError('f3 error') return x + 1 if __name__ == '__main__': start_funboost_web_manager(port=27018) # 也可以在python代码中启动web,来启动 funweb funboost队列管理界面。可以不需要命令行来启动。 f.multi_process_consume(4) f2.multi_process_consume(5) aio_f3.consume() for i in range(0, 1000000): f.push(i) f2.push(i) aio_f3.push(i) time.sleep(1) ctrl_c_recv() ``` ## 13.4 funweb 系统功能-脚本部署管理(爽功能) `funweb`的 `系统功能` 说明 funweb 的系统功能 和 funboost分布式函数调度框架以及消息队列的关系不大。 因为你即使不用funboost框架运行消费,也可以使用`funweb`来部署脚本,监控服务器资源等。 这属于系统级功能,和你用不用funboost框架发布消息+执行消息没有个卵的关系。 > 🚀 **funweb 的脚本部署 = Supervisor + Jenkins + ELK,却轻量得不像话** Funboost 让你在浏览器里**一键管理任何语言的脚本**: | 角色 | 功能对标 | Funboost 实现 | | :--- | :--- | :--- | | 👼 **进程守护神** | Supervisor | 进程启动、停止、重启、自动保活 | | 🚀 **自动发布机** | Jenkins | Git 拉取 + 分支切换 + 自动重启 | | 📊 **日志聚合中心** | ELK | 关键字搜索、时间筛选、大文件支持、级别着色 | **核心优势**:无需额外部署,开箱即用,轻量级一体化解决方案。 ### 13.4.1 核心功能 - **部署管理**:新建、编辑、复制、删除部署配置,配置项包括 部署名称、项目根目录、启动命令、环境变量。 - **进程控制**:一键启动、停止、重启。支持配置多进程数量(默认1个),每个进程独立管理。 - **自动启动/自动重启**:可配置 `auto_start`(web 服务启动时自动拉起)和 `auto_restart`(进程崩溃后自动重启,可设最大连续重试次数,默认3次)。人工在页面停止的进程不会被自动重启。 - **更新并重启**:一键执行 `git pull` + 重启,支持分支切换、模糊搜索分支,git 操作失败自动取消重启。 - **日志查看**:支持关键字搜索、按时间范围筛选(快捷按钮 + 自定义范围)、自动刷新。基于二分查找实现,兼容 10GB 级大日志文件。日志按级别着色显示(DEBUG 绿/INFO 青/WARNING 金黄/ERROR 粉红/CRITICAL 血红/print 天蓝)。 - **健康检查**:启动后自动检测进程存活(可配置检查时长,默认10秒),进程秒退立即报错并显示日志尾部辅助诊断。 - **PID 安全**:通过进程创建时间二次校验,防止系统重启后 PID 复用导致误判或误杀。 ### 13.4.2 使用方式 启动 funweb 后,在左侧导航栏点击「脚本部署」进入。 **新建部署示例:** | 配置项 | 示例值 | |--------|--------| | 部署名称 | my_worker | | 项目根目录 | /home/user/my_project | | 启动命令 | python main.py | | 进程数量 | 2 | | 自动启动 | ✓ | | 自动重启 | ✓ | 项目根目录会自动加入 `PYTHONPATH`。脚本以后台方式运行(Linux 用 nohup,Windows 用静默后台进程),关闭 web 管理页面或 Flask 进程不影响已部署的脚本运行。 stdout/stderr 自动重定向到 `{日志目录}/{部署名称}.nohup.log`,多进程时每个进程独立日志文件。 #### 13.4.2.2 funboost 查看日志按时间筛选范围说明 如果你要按时间范围筛选日志,请用nb_log。 funboost 后台会搜索 时间字符串,所以你的print和日志最开头需要是 `%Y-%M-%d %H:%m:%S` ,建议你导入使用`nb_log`,print和日志自动有这样的时间前缀。 如果你不想用nb_log,还想支持日志按时间范围筛选,需要确保你的控制台输出,每个打印前面都是有这个时间前缀 `%Y-%M-%d %H:%m:%S` ### 13.4.3 funweb 脚本部署功能说明 - 脚本部署功能不依赖 funboost 框架本身,可以部署任意 Python 脚本甚至非 Python 命令,只要能在命令行运行即可。 - 部署配置持久化在 Redis 中,重启 web 服务后配置不丢失。 - 兼容 Windows 和 Linux。 ### 13.4.4 脚本部署功能截图 脚本部署列表页截图  脚本部署详情页截图  ### 13.4.5 降维打击:funweb 脚本部署为何完爆 Supervisor? 在传统的 Python 后端部署中,`Supervisor` 或是 `Systemd` 几乎是进程管理的“标配”。但对于只关心业务逻辑的开发者来说,这些系统级工具存在极高的心智负担:需要手写枯燥的 `.ini` 配置文件、缺乏代码更新能力、排查“秒退”报错极其痛苦,看日志还得 SSH 连上服务器敲 `tail` 命令。 funweb 内置的**脚本部署功能**,彻底打破了“开发”与“运维”的边界。它不仅完美覆盖了 Supervisor 的进程守护与自动重启能力,更在体验和底层技术上实现了全方位的降维打击: #### 13.4.5.1. 📝 纯 Web 可视化配置,告别反人类的 `.ini` 与环境变量地狱 * **Supervisor 的痛**:部署一个新脚本,你必须登录服务器,小心翼翼地手写 `.ini` 或 `.conf` 文件。尤其是配置 `PYTHONPATH` 或复杂的虚拟环境环境变量时,各种引号转义让人抓狂;少写一个分号进程就起不来。 * **Funboost 的爽**:纯 Web 可视化表单!启动命令、项目路径、环境变量(支持直接填 JSON)、多进程数量、失败重试次数,**全部在网页上点选和填写**。点击保存立刻生效,极大地降低了部署门槛。 * **神级附加功能**:支持**一键复制(Clone)**部署配置!想把 `Task A` 的部署方案微调后给 `Task B` 用?网页上点一下复制即可,而 Supervisor 需要你 SSH 上去 `cp a.ini b.ini` 然后再用 `vim` 修改。 #### 13.4.5.2. ⚡️ 堪比 ELK 的神级日志检索(百G日志,毫秒级响应) * **Supervisor 的痛**:只能用 `tail -f` 看实时日志。如果想按时间段或关键字搜索历史日志,要么拉取几 GB 的日志文件到本地导致电脑卡死,要么必须重金部署沉重的 `ELK (Elasticsearch + Logstash + Kibana)` 架构。 * **Funboost 的爽**:底层通过纯 Python 实现了**基于时间戳的二分查找算法 (`O(log N)` 时间复杂度)**。即使是高达 **10GB+** 的超大 `nohup` 日志文件,也能在网页端**毫秒级**精准定位到任意时间范围内的日志,并且不占用服务器多余内存。 * **自动高亮**:根据日志级别(INFO/WARNING/ERROR 等),网页端自动渲染彩色大色块,错误堆栈一目了然。 #### 13.4.5.3. 🚀 内置 CI/CD:兼具“发版平台”能力 * **Supervisor 的痛**:它只是一个单纯的“进程看门狗”。每次更新代码,你依然需要手动连上服务器执行 `git pull`,然后再去执行 `supervisorctl restart xx`。 * **Funboost 的爽**:将 **代码拉取** 与 **进程重启** 完美融合。 * 网页端自带 `Git Pull` 按钮,自动检测本地与远程分支,支持下拉选择、无缝切换分支。 * 点一下按钮,Funboost 会在后台全自动执行:Git 拉取 -> 解决环境路径 -> 优雅关闭旧进程 -> 拉起新进程。**你直接拥有了一个轻量级的自动化发版平台**。 #### 13.4.5.4. 🛡️ 进程防误杀机制:解决 PID 复用的终极痛点 * **Supervisor 的痛**:依赖 PID 文件(如 `supervisord.pid`)管理进程。如果服务器遭遇强制重启或 PID 文件未及时清理,操作系统会将原 PID 分配给其他无辜进程(比如 MySQL 进程),Supervisor 会错误地将该进程当成自己的子进程去监控甚至“强杀”,导致严重的生产事故。 * **Funboost 的爽**:底层源码中引入了极致的防御性编程。Funboost 不仅记录 PID,还通过调用 OS 底层 API(Windows 的 `GetProcessTimes`,Linux 的 `/proc/pid/stat`)精确获取**进程的系统级创建时间戳**。在执行停止或重启操作时,必须同时校验 `PID + 创建时间` 双重特征。彻底杜绝了“杀错进程”的系统级 Bug,稳如泰山! #### 13.4.5.5. 🏥 智能健康检查与“秒退”精准诊断 * **Supervisor 的痛**:如果代码有语法错误 (`SyntaxError`) 或缺少依赖包 (`ModuleNotFoundError`),启动后进程会瞬间退出。Supervisor 只会冷冰冰地显示一个 `FATAL` 状态,你只能自己去翻找错误日志。 * **Funboost 的爽**:自带启动健康检查等待期(如默认 10 秒)。 * 如果进程在这几秒内“秒退”,Funboost 不仅会立即在网页弹窗报错,还会**自动抓取该进程死亡前输出的最后数十行日志尾部(Traceback 错误堆栈)**,直接展示在 Web 弹窗里!你连日志页面都不用进,立刻就能知道代码错在哪。 #### 13.4.5.6. 💻 真正的跨平台支持与“零特权”部署 (Win/Linux 双端通吃) * **Supervisor 的痛**:**原生不支持 Windows**。在 Windows 服务器上部署 Python 后台任务简直是开发者的噩梦。此外,在 Linux 下安装和配置 Supervisor 通常需要 `root` 权限。 * **Funboost 的爽**: * **双端一致**:底层代码对 OS 进行了精密的兼容处理。无论你的服务器是 Linux 还是 Windows,Web 端的操作体验完全一致(底层智能调用 `kill -9` 或 `taskkill /F /PID`)。 * **用户态运行**:Funboost 的守护线程和部署逻辑完全运行在**普通用户权限**下,无需 `root`,无需修改系统级服务文件,对缺乏服务器高权限的开发者极其友好。 #### 13.4.5.7. 👁️ 告别黑箱,极致的透明操作反馈 * **传统运维工具的痛**:点击操作后,页面转个圈就提示“成功”或“失败”,底层到底执行了什么命令,执行目录在哪,开发者一无所知。 * **Funboost 的爽**:每一次启动、停止、重启或 Git 操作,网页都会弹框**实时、透明地显示底层执行的完整 Shell 命令细节、绝对工作路径以及解析后的环境变量**(例如:`nohup python xxx.py --deploy_flag=UUID >> log.log 2>&1 &`)。这种极致的透明度,给了开发者绝对的安全感和掌控感。 --- > **💡 终极总结**: > Funboost 的脚本部署模块,本质上是**将繁重的运维基建(Supervisor + Jenkins + ELK日志部分)打包降维成了一个轻量级的 Web 页面**。它不仅是进程看门狗,更是专为 Python 开发者量身定制的“现代化 DevOps 中枢”,让你在浏览器里就能优雅地掌控所有算力! ### 13.4.6 funweb 是否支持远程部署(部署到其他机器)? 答:funweb 可以在你自己的电脑开浏览器,打开网址,点击部署到远程机器。 例如你的linux机器ip是 10.1.2.3 你在linux机器部署启动 funweb ,暴露端口,假设端口是 27011 然后你再自己的浏览器,打开 10.1.2.3/27011 ,登录,点击网页左侧脚本部署模块 你点击 `更新重启` 按钮就可以更新拉取git仓库代码,并启动脚本。 #### 13.4.6.2 Funboost 部署 vs 传统 Jenkins 发版平台:为什么我们选择“本地化”? 传统的 Jenkins 或运维魔改的发版平台,采用的是**中心化架构**:由一台发版服务器通过 SSH 远程把代码分发到多台机器上,目标机器不需要运行 Web 服务。 客观地说,如果你要把同一个服务同时滚动发布到 10 几台甚至上百台机器,Jenkins 确实更省力。 但是,对于中小型 Python 任务、爬虫脚本的部署,**funweb 这种“直接跑在目标机器上”的去中心化模式,带来了 Jenkins 无法企及的爽感:** 1. **配置难度骤降 10 倍**:在 Jenkins 里配一个新项目,你要搞 SSH 密钥、写 Pipeline 脚本、配置工作空间,繁琐至极。在 Funboost 里,只需填个本地目录和启动命令,点下保存,**10 秒钟直接搞定**! 2. **丝滑的“本地级”操控**:因为 Web Manager 就跑在目标机器上,它无需忍受 SSH 网络延迟。健康检查、探活、自动重启,全部直接调用操作系统的底层 API(如读取 `/proc` 或 Windows 进程句柄),**毫秒级响应,极其稳定且防误杀**。 3. **本地日志光速直读**:不需要通过 SSH 缓慢拉取日志,也不需要搞复杂的 ELK 收集链路。直接基于本地磁盘文件做时间戳二分查找,**10G 级别的日志随搜随出,所见即所得**。 4. **零 DevOps 依赖**:不需要求着专业运维去搭 Jenkins 集群,任何一个懂点 Python 的普通开发者,自己敲一行 `python -m funboost.funweb.app`,就能瞬间把服务器变成一个好用的自动化发版平台。 ### 13.4.7 降维打击:Funboost Web 部署比直接用 Xshell 爽在哪里? 很多老鸟习惯了直接用 Xshell、SecureCRT 连上服务器敲命令行。但一旦你用过 Funboost 的 Web 脚本部署,就会发现传统的 SSH 操作有多么反人类: #### 13.4.7.1. 🔌 告别繁琐的登录与“断连焦虑” * **Xshell 的痛**:每次部署都要走一套繁琐的流程:开 VPN -> 找主机 IP -> 输密码/配密钥。最恶心的是,现在的服务器为了安全风控都有超时机制,切出去看个文档,回来连接就断了,又得重新登录。 * **Funboost 的爽**:只要浏览器标签页没关,随时刷新随时看,状态永远在线,彻底治愈你的断连焦虑。 #### 13.4.7.2. 🖱️ 零门槛“傻瓜式”操作,彻底解放开发者 * **Xshell 的痛**:敲命令不仅容易拼错,**协同成本更是灾难**。当你改了代码,想让测试妹子去重启验证时,面对习惯了“点点点”的 QA,你教她 10 遍 `git pull && nohup python ...` 她也学不会,最后还是得你亲自去敲。 * **Funboost 的爽**:把 URL 丢给测试/前端/产品,告诉他们:“想测最新代码,自己去页面点一下【Git Pull】和【重启】”。全程点鼠标,绝不犯错,把开发从枯燥的“人肉发版机”中彻底解放出来。 #### 13.4.7.3. 👁️ 拒绝“黑盒启动”,所见即所得的存活监控 * **Xshell 的痛**:敲完 `nohup ... &` 后心里直打鼓,根本不知道启动成功没有。每次都得习惯性地再敲一遍 `ps aux | grep xxx` 去核对进程名和 PID,确认它还活着。 * **Funboost 的爽**:启动后,网页直接亮起绿灯,清晰展示当前存活的 PID 列表和持续运行时间。如果发生“秒退”,会直接把错误堆栈抓取并**弹窗糊你脸上**,再也不用像个瞎子一样去猜进程死没死。 #### 13.4.7.4. 📖 降维打击的日志查阅体验,终结反人类的 `grep` * **Xshell 的痛**:查日志极其痛苦。 * **时间范围难查**:用 `awk` 或 `sed` 截取特定时间段的日志,语法复杂到让人怀疑人生。 * **多行报错支离破碎**:用 `grep` 搜关键字,一旦遇到跨行的异常堆栈(Traceback),只能搜出孤零零的一行,根本看不出完整的报错上下文。 * **Funboost 的爽**:提供极简的时间范围选择器和关键字检索。基于时间戳二分查找,百G日志毫秒级出结果;完美保留多行异常堆栈的完整上下文,自带彩色高亮。**相当于白嫖了一个轻量级的 ELK 日志系统**。 #### 13.4.7.5. 🛡️ 自带“死而复生”的进程守护,远超脆弱的 `nohup` * **Xshell 的痛**:用 `nohup xxx &` 跑爬虫或后台任务,一旦遇到网络超时、未捕获异常或者内存溢出(OOM),进程死了就真死了。大半夜挂掉,第二天早上才发现数据断更。 * **Funboost 的爽**:网页上勾选 `自动重启 (auto_restart)`,框架内置的后台守护线程会每 10 秒巡检一次。进程一旦意外死亡,**直接原地满血拉起!**你相当于白嫖了一个轻量级的 Supervisor。 #### 13.4.7.6. 🧬 配置资产沉淀,告别“祖传 txt 小本本” * **Xshell 的痛**:启动一个复杂的 Python 项目,你需要先激活虚拟环境,再 export `PYTHONPATH=/xxx/yyy`,最后跟上一大串启动参数。时间一长根本记不住,只能在电脑桌面建个 `常用命令.txt` 每次复制粘贴,换台电脑就抓瞎。 * **Funboost 的爽**:你的启动命令、工作目录、乃至复杂的环境变量(JSON格式),全部作为**配置资产**永久固化在服务端。三年后回来看,点一下“启动”照样丝滑运行,甚至还能一键 Clone 出一个新配置。 #### 13.4.7.7. 🎯 精准狙击 PID,彻底杜绝“同名误杀”惨案 * **Xshell 的痛**:服务器上同时跑着 20 个 `python main.py`,你想停掉其中某个旧版任务。用 `ps -ef | grep python` 查出来一堆长得一模一样的进程,肉眼分辨极度痛苦;一怒之下用 `pkill python`,结果把同事跑的、或者其他核心业务的 Python 进程全给“误杀”了,直接引发 P0 级生产事故。 * **Funboost 的爽**:框架底层严格记录了自己拉起的每一个进程的 `PID` 和 `OS级创建时间戳`。点击“停止”时,它**只杀自己管辖的进程,指哪打哪,绝对安全**,把你从提心吊胆的 `kill -9` 中解救出来。 #### 13.4.7.8. ⚖️ 傻瓜式的一键“多进程”横向扩容 * **Xshell 的痛**:发现单进程消费太慢,想开 10 个进程提速?你要么在 Shell 里像个机器一样按 10 次“上箭头+回车”,要么现场手搓一个 bash 的 `for` 循环脚本。 * **Funboost 的爽**:网页表单里有个【进程数】填空框。把 1 改成 10,点击重启。10 个独立的 Python 进程瞬间整齐划一地拉起。**横向扩容,只需修改一个数字。** ## 13.5 funweb 系统功能-资源监控 你把`funweb`部署在任何电脑,就能持续采集和监控该电脑的cpu 内存 磁盘使用率了。 实现方式是有个线程,每隔10秒使用psutil采集服务器的资源使用率,保存到redis zset中。 `funweb`页面展示这些指标的实时仪表盘以及长期走势曲线。 实现代码在 `funboost\funweb\system_monitor.py` funweb 系统功能-资源监控 截图  ## 13.6 📖 funweb 系统功能 - 通用日志查看器 `funweb` 内置的日志查看器是一个功能强大的系统级组件。它旨在为开发者提供一个**开箱即用、脱离 SSH 终端**的 Web 日志排查方案。 ### 13.6.2 ✨ 功能亮点 1. **绝对通用的文件读取** * 不限编程语言:支持查看 Python, Java, Go 等任意语言生成的日志文件。 * 不限部署方式:完全独立于 `funweb` 的“脚本部署”功能。无论程序是 `nohup` 挂起还是作为系统服务运行,只要是文本文件,皆可查看。 2. **强大的检索与过滤** * 支持按**精确的时间段**(起止时间)对日志进行截取筛选。 * 支持对日志内容进行**关键字搜索**,快速定位异常(Exception/Error)堆栈。 3. **极致的实时监控 (`tail -f` 体验)** * 底层采用 **SSE (Server-Sent Events)** 单向事件流技术(`mimetype='text/event-stream'`)。 * 实现以**毫秒级**极低延迟,将服务器产生的最新日志增量实时推送到网页端,拒绝卡顿与重复加载。 **日志查看器截图** **眼又极其清晰的“彩色日志”** 这绝对是排查问题的最大爽点!传统的 tail -f 往往是一坨黑白乱码,看久了眼睛疼。 