V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

nextjs 项目, docker 容器部署,有什么简单的持久化日志的方案吗

  •  
  •   rizon ·
    othorizon · 304 天前 · 3894 次点击
    这是一个创建于 304 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是用的 dockercompose 部署的,每次 docker up 都会重新创建镜像,日志自然也删除了。

    项目的启动命令是:node server.js , 这种情况下,有什么简单的日志持久化的方法啊。

    第 1 条附言  ·  304 天前
    我的问题没有描述清楚,
    首先我的 nextjs 项目日志默认打印到控制台,我不知道有什么工具可以简单的配置一下让日志在往控制台打印的同时还能输出到文件。
    第二,如果在 docker 的配置里把服务的控制台日志重定向到文件(node server..js 2>&1 > run.log),就会导致 docker 的 logs 命令以及第三方的工具无法直接按照 docker 的规范读取控制台日志了。我还是希望保持日志输出到控制台的同时再采集日志到文件。
    29 条回复    2024-03-08 11:42:28 +08:00
    linzhe141
        1
    linzhe141  
       304 天前
    volumes:
    - ./log:/app/log
    AlicFeng
        2
    AlicFeng  
       304 天前
    EFK
    Gooon
        3
    Gooon  
       304 天前
    grafana loki promtail
    Gooon
        4
    Gooon  
       304 天前
    或者可以直接走 docker 的 log-driver 到 loki
    Cola98
        5
    Cola98  
       304 天前
    用一楼老哥的方法,你挂一个 volume 持久化到本地就可以了
    Trim21
        6
    Trim21  
       304 天前
    装个 loki ,应用直接把日志打到 stdout ,用 docker 的 loki 插件把 stdout 的日志转发到 loki 就行了
    ZnductR0MjHvjRQ3
        7
    ZnductR0MjHvjRQ3  
       304 天前
    你日志放容器肯定不行吧 怎么说也应该挪到外面
    zhufpy
        8
    zhufpy  
       304 天前
    挂在出来呗
    wheat0r
        9
    wheat0r  
       304 天前
    你甚至可以在容器里配置 rsyslog 向 syslog 服务器发送日志,通过环境变量把服务器地址传进容器
    dudubaba
        10
    dudubaba  
       304 天前
    服务器是房子,镜像是人,日志是家具,人走了不可能带走家具吧?家具肯定还在房子里。所以日志放服务器上,具体怎么放,搜 docker volumes
    rizon
        11
    rizon  
    OP
       304 天前
    @linzhe141 #1
    @Cola98 #5
    @zhufpy #8
    @dudubaba #10
    是我的问题,我没有描述清楚诉求,首先我的 nextjs 项目日志默认打印到控制台,我不知道有什么工具可以简单的配置一下让日志输出到文件。
    第二,如果在 docker 的配置里把服务的控制台日志重定向到文件(node server..js 2>&1 > run.log),就会导致 docker 的 logs 命令以及第三方的工具无法直接按照 docker 的规范读取控制台日志了。
    anubu
        12
    anubu  
       304 天前
    如果是为了控制台能查看日志并保存到文件持久化,可以简单使用 tee 命令。node server.js 2>&1 | tee app.log
    rocmax
        13
    rocmax  
       303 天前
    导入一个 log 库,想传哪就传哪
    比如[pino]( https://github.com/pinojs/pino)
    rizon
        14
    rizon  
    OP
       303 天前
    @anubu #12 这个不行的,tee 只在进程结束后才写日志,不是实时的。


    @rocmax #13 这个库看着不错,就是要改造一下代码了。好像也没更简单的办法了
    ke1e
        15
    ke1e  
       303 天前 via Android
    Docker 的部署启动的项目,无论 Java nodejs 啥的,日志直接打印到控制台,有专门收集 Docker 日志的工具,像 Vector( https://vector.dev/docs/reference/configuration/sources/docker_logs/),你所需要做的就是把这种日志收集工具按你的需求配置好就行了,很简单的,对项目无侵入
    rizon
        16
    rizon  
    OP
       303 天前
    @anubu #12 可能是我配置的问题,测了一下 tee 应该是能用的。不考虑日志滚动的情况下,这个我感觉是成本最低的方案了,我再试试。
    momocraft
        17
    momocraft  
       303 天前
    你已经在用容器了, "让 nextjs 多写一份 log 到文件" 属于自己创造问题

    正确途径是学习使用 docker logging driver
    然后把 log 流到专门接收 log 的东西, 比如我自己在用的 fluent-bit
    有了这种东西多保存一份到文件也可以, 再转发到别的 log 存储也可以
    liuhai233
        18
    liuhai233  
       303 天前
    fluentd 这种就行了,无论是 k8s 还是 docker 都有主流日志收集方案
    jalena
        19
    jalena  
       303 天前
    docker 不是默认会按 json-log 的形式把它写入到文件么~~

    `docker inspect mysql | grep 'LogPath'`
    rocmax
        20
    rocmax  
       303 天前 via Android
    实际上使用 log 库才是最佳实践,因为 console.log 是同步的,性能损耗较大。可以搜一下有不少 benchmark 结果。

    > Due to Node's single-threaded event-loop, it's highly recommended that sending, alert triggering, reformatting, and all forms of log processing are conducted in a separate process or thread.
    rocmax
        21
    rocmax  
       303 天前 via Android
    @rocmax 当然这根容器外部收集方案不冲突
    dudubaba
        22
    dudubaba  
       303 天前
    @rizon nestjs 用的比较多的是这个 https://www.npmjs.com/package/winston ,搜一下有很多集成案例。
    rizon
        23
    rizon  
    OP
       303 天前
    @rocmax #20 打算换成 @rocmax #13 推荐的这个 pino
    rizon
        24
    rizon  
    OP
       303 天前
    @rizon #23
    @dudubaba #22 这个库也不错啊,我看看这个
    rocmax
        25
    rocmax  
       303 天前 via Android
    @rizon Winston 是老牌 log 库了,服务器端使用没问题。
    nextjs 使用的话有一个问题是 Winston 依赖于 node 环境,nextjs 的 middleware 运行在 edge 环境
    rizon
        26
    rizon  
    OP
       303 天前
    @rocmax #25 我是自己服务器托管运行的,倒是没有这个问题,但是你这到提醒我了,nextjs 项目里还有跑在客户端的代码,我日志配置起来有些麻烦,还要分开服务端和客户端写代码,一不小心就写错了。 所以该日志库似乎也不是个好的方案
    rocmax
        27
    rocmax  
       303 天前 via Android   ❤️ 1
    myon
        28
    myon  
       302 天前
    用 pm2 启服务,docker 映射 pm2 日志目录
    zhufpy
        29
    zhufpy  
       296 天前
    @rizon docker run 加上--log-driver=json-file 然后 node server..js 2>&1 > run.log 这样 docker 的 logs 命令应该也能查看这个日志了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:55 · PVG 21:55 · LAX 05:55 · JFK 08:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.