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

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

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

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

其实很简单,就是一个 websocket web 端,通过 websocket 连接到服务器上,然后服务端通过 docker sdk 从指定容器里面取日志输出,web 拿到日志后就直接打印日志。
Lax
213 天前
ELK stack 和一堆替代品都可以,搜一搜
qazwsxkevin
213 天前
看了大佬各种提示,点赞已送出,我估计我还是有必要去了解 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
213 天前
elk
dode
213 天前
每次请求读取前面 10 行,轮询请求
dode
213 天前
监控一个文件的实时变化,tail -f xxx.log
vacuitym
213 天前
不如 promtail + loki + grafana
dode
213 天前
之前用 go 坐一个实时读取日志处理的工具

https://github.com/fsnotify/fsnotify
guoguobaba
206 天前
最简单,放到 k8s 里,然后读 pod 的日志,可以通过 rest api 。
yanyao233
204 天前
最近也有这个需求,不过我的日志是基于 loguru 的,好实现一点...基本思路就是 flask 启动个 ws ,loguru 增加个 handler 在有新日志时发送到 ws 接口。

现在就卡在了 ui 上...能做的都太简陋,做不了的又太复杂
qazwsxkevin
204 天前
@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