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 · 200 天前 · 1520 次点击
    这是一个创建于 200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    没搞过 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  
       200 天前   ❤️ 1
    写到文件,让另一个进程/线程持续读这个文件并通过 websocket 推送到浏览器
    NoOneNoBody
        2
    NoOneNoBody  
       200 天前   ❤️ 1
    显示是简单地,内存->显示(排序)就好了
    写文件可能需要锁,或者数据库
    你用关键词,带上"pypi"能搜到,这个需求应该不少人做过,哪个轮子更好就要看别人的 review 了
    fannheyward
        3
    fannheyward  
       200 天前   ❤️ 3
    julyclyde
        4
    julyclyde  
       200 天前   ❤️ 1
    1 为什么子进程的不能在 console 显示?啥原理?

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

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

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

    现在就卡在了 ui 上...能做的都太简陋,做不了的又太复杂
    qazwsxkevin
        16
    qazwsxkevin  
    OP
       191 天前
    @yanyao233 #15 嗯嗯,发完帖子后,正事太多,这个事情有时间我也只是一天弄两三下,ws 部分我已经搞明白起服务投送内容,客户端也能收到,web 我没用到 flask 的框架,直接拿了 asyncio 的做法例子改了一下,asyncio 异步的方式目前似乎很难嵌入到当前准备搞的代码逻辑里,况且将来 client 必定要发出一些操作指令,停止服务什么的,所以 asyncio 写法要改成类对象写法,有些折腾。。。。
    UI 打算来粗暴的,拼接 td+tr ,计数器够阈值+20 ,重画 table ,一个页面 CPU 肯定拉高的,不管了,先跑出内容再说。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   920 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:29 · PVG 06:29 · LAX 15:29 · JFK 18:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.