nextjs 项目, docker 容器部署,有什么简单的持久化日志的方案吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX    程序员

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

  •  
  •   rizon
    othorizon 2024-02-29 13:37:42 +08:00 4607 次点击
    这是一个创建于 594 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

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

    `docker inspect mysql | grep 'LogPath'`
    rocmax
        20
    rocmax  
       2024-03-01 08:20:46 +08:00 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  
       2024-03-01 08:21:34 +08:00 via Android
    @rocmax 当然这根容器外部收集方案不冲突
    dudubaba
        22
    dudubaba  
       2024-03-01 10:55:02 +08:00
    @rizon nestjs 用的比较多的是这个 https://www.npmjs.com/package/winston ,搜一下有很多集成案例。
    rizon
        23
    rizon  
    OP
       2024-03-01 12:09:09 +08:00
    @rocmax #20 打算换成 @rocmax #13 推荐的这个 pino
    rizon
        24
    rizon  
    OP
       2024-03-01 12:12:04 +08:00
    @rizon #23
    @dudubaba #22 这个库也不错啊,我看看这个
    rocmax
        25
    rocmax  
       2024-03-01 15:12:06 +08:00 via Android
    @rizon Winston 是老牌 log 库了,服务器端使用没问题。
    nextjs 使用的话有一个问题是 Winston 依赖于 node 环境,nextjs 的 middleware 运行在 edge 环境
    rizon
        26
    rizon  
    OP
       2024-03-01 17:50:30 +08:00
    @rocmax #25 我是自己服务器托管运行的,倒是没有这个问题,但是你这到提醒我了,nextjs 项目里还有跑在客户端的代码,我日志配置起来有些麻烦,还要分开服务端和客户端写代码,一不小心就写错了。 所以该日志库似乎也不是个好的方案
    rocmax
        27
    rocmax  
       2024-03-01 18:24:03 +08:00 via Android   1
    myon
        28
    myon  
       2024-03-02 15:29:14 +08:00
    用 pm2 启服务,docker 映射 pm2 日志目录
    zhufpy
        29
    zhufpy  
       2024-03-08 11:42:28 +08:00
    @rizon docker run 加上--log-driver=json-file 然后 node server..js 2>&1 > run.log 这样 docker 的 logs 命令应该也能查看这个日志了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5763 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 02:50 PVG 10:50 LAX 19:50 JFK 22:50
    Do have faith in what you're doing.
    ubao msn 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