各线程产生的日志信息,用 Web 服务方式刷出来给人看,简单来说, Python 需要什么技术实现?(有轮子否?) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX    Python

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

  •  
  •   qazwsxkevin 2023-10-10 12:56:46 +08:00 2282 次点击
    这是一个创建于 734 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    其实很简单,就是一个 websocket web 端,通过 websocket 连接到服务器上,然后服务端通过 docker sdk 从指定容器里面取日志输出,web 拿到日志后就直接打印日志。
    Lax
        7
    Lax  
       2023-10-10 15:54:25 +08:00   1
    ELK stack 和一堆替代品都可以,搜一搜
    qazwsxkevin
        8
    qazwsxkevin  
    OP
       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
        9
    luoshuimumu  
       2023-10-10 17:07:49 +08:00   1
    elk
    dode
        10
    dode  
       2023-10-10 18:02:33 +08:00   1
    每次请求读取前面 10 行,轮询请求
    dode
        11
    dode  
       2023-10-10 18:03:24 +08:00   1
    监控一个文件的实时变化,tail -f xxx.log
    vacuitym
        12
    vacuitym  
       2023-10-10 18:03:52 +08:00   1
    不如 promtail + loki + grafana
    dode
        13
    dode  
       2023-10-10 18:05:10 +08:00   1
    之前用 go 坐一个实时读取日志处理的工具

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

    现在就卡在了 ui 上...能做的都太简陋,做不了的又太复杂
    qazwsxkevin
        16
    qazwsxkevin  
    OP
       2023-10-19 22:01:07 +08:00
    @yanyao233 #15 嗯嗯,发完帖子后,正事太多,这个事情有时间我也只是一天弄两三下,ws 部分我已经搞明白起服务投送内容,客户端也能收到,web 我没用到 flask 的框架,直接拿了 asyncio 的做法例子改了一下,asyncio 异步的方式目前似乎很难嵌入到当前准备搞的代码逻辑里,况且将来 client 必定要发出一些操作指令,停止服务什么的,所以 asyncio 写法要改成类对象写法,有些折腾。。。。
    UI 打算来粗暴的,拼接 td+tr ,计数器够阈值+20 ,重画 table ,一个页面 CPU 肯定拉高的,不管了,先跑出内容再说。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     981 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:57 PVG 02:57 LAX 11:57 JFK 14:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86