各线程产生的日志信息,用 Web 服务方式刷出来给人看,简单来说, Python 需要什么技术实现?(有轮子否?)

2023-10-10 12:56:46 +08:00
 qazwsxkevin

没搞过 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 上有大佬的某个部分实现过这样的方式吗?
如果要自己撸,从思路上来说,有什么技术关键字可提示一下,怎么去实现?

1861 次点击
所在节点    Python
16 条回复
lanlanye
2023-10-10 12:58:57 +08:00
写到文件,让另一个进程/线程持续读这个文件并通过 websocket 推送到浏览器
NoOneNoBody
2023-10-10 13:13:35 +08:00
显示是简单地,内存->显示(排序)就好了
写文件可能需要锁,或者数据库
你用关键词,带上"pypi"能搜到,这个需求应该不少人做过,哪个轮子更好就要看别人的 review 了
fannheyward
2023-10-10 13:17:05 +08:00
julyclyde
2023-10-10 13:55:02 +08:00
1 为什么子进程的不能在 console 显示?啥原理?

你这问题,我建议还是分离成收集和展示两部分
如果你只有一个,会遇到很多问题:如何接入以前的 stdout 、stderr 、从哪里开始读、读过的部分是否抛弃,之类的
chongdianbao
2023-10-10 14:00:36 +08:00
简单点,直接把日志输出到一个 mqtt 服务器
cdlnls
2023-10-10 14:11:07 +08:00
哈哈,我有一个现成的工具,不过是读取 docker 控制台的日志,然后在网页上滚动打印。web 形态和你正文描述的基本一样。

其实很简单,就是一个 websocket web 端,通过 websocket 连接到服务器上,然后服务端通过 docker sdk 从指定容器里面取日志输出,web 拿到日志后就直接打印日志。
Lax
2023-10-10 15:54:25 +08:00
ELK stack 和一堆替代品都可以,搜一搜
qazwsxkevin
2023-10-10 17:01:19 +08:00
看了大佬各种提示,点赞已送出,我估计我还是有必要去了解 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 不会显示出来,不是为了求职、工作,只是玩的,只是知道是机制问题,就没细究下去。。。
luoshuimumu
2023-10-10 17:07:49 +08:00
elk
dode
2023-10-10 18:02:33 +08:00
每次请求读取前面 10 行,轮询请求
dode
2023-10-10 18:03:24 +08:00
监控一个文件的实时变化,tail -f xxx.log
vacuitym
2023-10-10 18:03:52 +08:00
不如 promtail + loki + grafana
dode
2023-10-10 18:05:10 +08:00
之前用 go 坐一个实时读取日志处理的工具

https://github.com/fsnotify/fsnotify
guoguobaba
2023-10-17 13:20:25 +08:00
最简单,放到 k8s 里,然后读 pod 的日志,可以通过 rest api 。
yanyao233
2023-10-19 21:04:04 +08:00
最近也有这个需求,不过我的日志是基于 loguru 的,好实现一点...基本思路就是 flask 启动个 ws ,loguru 增加个 handler 在有新日志时发送到 ws 接口。

现在就卡在了 ui 上...能做的都太简陋,做不了的又太复杂
qazwsxkevin
2023-10-19 22:01:07 +08:00
@yanyao233 #15 嗯嗯,发完帖子后,正事太多,这个事情有时间我也只是一天弄两三下,ws 部分我已经搞明白起服务投送内容,客户端也能收到,web 我没用到 flask 的框架,直接拿了 asyncio 的做法例子改了一下,asyncio 异步的方式目前似乎很难嵌入到当前准备搞的代码逻辑里,况且将来 client 必定要发出一些操作指令,停止服务什么的,所以 asyncio 写法要改成类对象写法,有些折腾。。。。
UI 打算来粗暴的,拼接 td+tr ,计数器够阈值+20 ,重画 table ,一个页面 CPU 肯定拉高的,不管了,先跑出内容再说。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/980587

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX