没搞过 Python Web.不懂就问
1 、logging 模块,以前(单线程)代码过程中,我只是简单地把各种组装的 str ,通过 logging 输出到 console ,跟 print 的意义差不多(基本都是直接 print 了),
现在启动了多线程,各线程都会产生 str(info),
print 的话,子线程的 info 在 console 不能显示,(我知道使用 logging 就可以指定输出到 console )
2 、现在想在服务上,启动一个 Web 服务,别人(其实只有我 1 个人),可以通过 Web 方式看到这些 info 滚动,知道运行状态
3 、Web 的形态应该是这样的,不是整个页面间隔整体间隔刷新,内容应该是直播滚动(就像 websocket 服务那样更新,推送逐条 info ),
在页面拖选复制内容的时候,下面的 info 继续新增(有 freeze 按钮定住当前屏也行),页面 1 千行 buffer ,新冲掉旧的
请问是否有这种现成的轮子?
github 上有大佬的某个部分实现过这样的方式吗?
如果要自己撸,从思路上来说,有什么技术关键字可提示一下,怎么去实现?
1
lanlanye 2023-10-10 12:58:57 +08:00 1
写到文件,让另一个进程/线程持续读这个文件并通过 websocket 推送到浏览器
|
2
NoOneNoBody 2023-10-10 13:13:35 +08:00 1
显示是简单地,内存->显示(排序)就好了
写文件可能需要锁,或者数据库 你用关键词,带上"pypi"能搜到,这个需求应该不少人做过,哪个轮子更好就要看别人的 review 了 |
3
fannheyward 2023-10-10 13:17:05 +08:00 3
|
4
julyclyde 2023-10-10 13:55:02 +08:00 1
1 为什么子进程的不能在 console 显示?啥原理?
你这问题,我建议还是分离成收集和展示两部分 如果你只有一个,会遇到很多问题:如何接入以前的 stdout 、stderr 、从哪里开始读、读过的部分是否抛弃,之类的 |
5
chongdianbao 2023-10-10 14:00:36 +08:00 1
简单点,直接把日志输出到一个 mqtt 服务器
|
6
cdlnls 2023-10-10 14:11:07 +08:00 1
哈哈,我有一个现成的工具,不过是读取 docker 控制台的日志,然后在网页上滚动打印。web 形态和你正文描述的基本一样。
其实很简单,就是一个 websocket web 端,通过 websocket 连接到服务器上,然后服务端通过 docker sdk 从指定容器里面取日志输出,web 拿到日志后就直接打印日志。 |
7
Lax 2023-10-10 15:54:25 +08:00 1
ELK stack 和一堆替代品都可以,搜一搜
|
8
qazwsxkevin OP 看了大佬各种提示,点赞已送出,我估计我还是有必要去了解 python websocket ,原理实现,至于前端,我随便懂皮毛的 js+css 画个样子(盒子)就 OK 了。。。,
至于线程日志中心收集,这个我能想到的是: (代码凭记忆大概是这样伪代码,拼写不完全正确,勿怨) ``` from multiprocessing import Manager # Log 处理队列 LogQueue = Manager().Queue() # 各线程 infoStr = "xxxx" LogQueue.put(infoStr) # 预计在 Websocket 处理环节 while not LogQueue.empty() somewebsockstream = LogQueue.get() @julyclyde #4 当时(3.6)没用原生的 threading ,用了当时还不是亲儿子的 future 模块,记得经过 concurrent.futures 包装的子进程/线程,内里 print ,主 console 不会显示出来,不是为了求职、工作,只是玩的,只是知道是机制问题,就没细究下去。。。 |
9
luoshuimumu 2023-10-10 17:07:49 +08:00 1
elk
|
10
dode 2023-10-10 18:02:33 +08:00 1
每次请求读取前面 10 行,轮询请求
|
11
dode 2023-10-10 18:03:24 +08:00 1
监控一个文件的实时变化,tail -f xxx.log
|
12
vacuitym 2023-10-10 18:03:52 +08:00 1
不如 promtail + loki + grafana
|
13
dode 2023-10-10 18:05:10 +08:00 1
|
14
guoguobaba 2023-10-17 13:20:25 +08:00 1
最简单,放到 k8s 里,然后读 pod 的日志,可以通过 rest api 。
|
15
yanyao233 2023-10-19 21:04:04 +08:00 1
最近也有这个需求,不过我的日志是基于 loguru 的,好实现一点...基本思路就是 flask 启动个 ws ,loguru 增加个 handler 在有新日志时发送到 ws 接口。
现在就卡在了 ui 上...能做的都太简陋,做不了的又太复杂 |
16
qazwsxkevin OP @yanyao233 #15 嗯嗯,发完帖子后,正事太多,这个事情有时间我也只是一天弄两三下,ws 部分我已经搞明白起服务投送内容,客户端也能收到,web 我没用到 flask 的框架,直接拿了 asyncio 的做法例子改了一下,asyncio 异步的方式目前似乎很难嵌入到当前准备搞的代码逻辑里,况且将来 client 必定要发出一些操作指令,停止服务什么的,所以 asyncio 写法要改成类对象写法,有些折腾。。。。
UI 打算来粗暴的,拼接 td+tr ,计数器够阈值+20 ,重画 table ,一个页面 CPU 肯定拉高的,不管了,先跑出内容再说。 |