我是用的 dockercompose 部署的,每次 docker up 都会重新创建镜像,日志自然也删除了。
项目的启动命令是:node server.js , 这种情况下,有什么简单的日志持久化的方法啊。
![]() | 1 ooo4 2024-02-29 14:38:38 +08:00 volumes: - ./log:/app/log |
2 AlicFeng 2024-02-29 15:26:39 +08:00 EFK |
![]() | 3 Gooon 2024-02-29 15:27:23 +08:00 grafana loki promtail |
![]() | 4 Gooon 2024-02-29 15:28:57 +08:00 或者可以直接走 docker 的 log-driver 到 loki |
5 Cola98 2024-02-29 15:43:57 +08:00 用一楼老哥的方法,你挂一个 volume 持久化到本地就可以了 |
![]() | 6 Trim21 2024-02-29 15:45:25 +08:00 装个 loki ,应用直接把日志打到 stdout ,用 docker 的 loki 插件把 stdout 的日志转发到 loki 就行了 |
7 ZnductR0MjHvjRQ3 2024-02-29 15:48:22 +08:00 你日志放容器肯定不行吧 怎么说也应该挪到外面 |
8 zhufpy 2024-02-29 15:49:17 +08:00 挂在出来呗 |
![]() | 9 wheat0r 2024-02-29 17:35:26 +08:00 你甚至可以在容器里配置 rsyslog 向 syslog 服务器发送日志,通过环境变量把服务器地址传进容器 |
![]() | 10 dudubaba 2024-02-29 20:36:09 +08:00 服务器是房子,镜像是人,日志是家具,人走了不可能带走家具吧?家具肯定还在房子里。所以日志放服务器上,具体怎么放,搜 docker volumes |
![]() | 11 rizon OP |
![]() | 12 anubu 2024-02-29 21:37:17 +08:00 如果是为了控制台能查看日志并保存到文件持久化,可以简单使用 tee 命令。node server.js 2>&1 | tee app.log |
13 rocmax 2024-02-29 23:10:56 +08:00 导入一个 log 库,想传哪就传哪 比如[pino]( https://github.com/pinojs/pino) |
![]() | 14 rizon OP |
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/),你所需要做的就是把这种日志收集工具按你的需求配置好就行了,很简单的,对项目无侵入 |
![]() | 16 rizon OP @anubu #12 可能是我配置的问题,测了一下 tee 应该是能用的。不考虑日志滚动的情况下,这个我感觉是成本最低的方案了,我再试试。 |
![]() | 17 momocraft 2024-03-01 00:18:06 +08:00 你已经在用容器了, "让 nextjs 多写一份 log 到文件" 属于自己创造问题 正确途径是学习使用 docker logging driver 然后把 log 流到专门接收 log 的东西, 比如我自己在用的 fluent-bit 有了这种东西多保存一份到文件也可以, 再转发到别的 log 存储也可以 |
![]() | 18 awsl2333 2024-03-01 01:32:44 +08:00 fluentd 这种就行了,无论是 k8s 还是 docker 都有主流日志收集方案 |
19 jalena 2024-03-01 01:41:13 +08:00 docker 不是默认会按 json-log 的形式把它写入到文件么~~ `docker inspect mysql | grep 'LogPath'` |
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. |
![]() | 22 dudubaba 2024-03-01 10:55:02 +08:00 @rizon nestjs 用的比较多的是这个 https://www.npmjs.com/package/winston ,搜一下有很多集成案例。 |
25 rocmax 2024-03-01 15:12:06 +08:00 via Android @rizon Winston 是老牌 log 库了,服务器端使用没问题。 nextjs 使用的话有一个问题是 Winston 依赖于 node 环境,nextjs 的 middleware 运行在 edge 环境 |
![]() | 26 rizon OP @rocmax #25 我是自己服务器托管运行的,倒是没有这个问题,但是你这到提醒我了,nextjs 项目里还有跑在客户端的代码,我日志配置起来有些麻烦,还要分开服务端和客户端写代码,一不小心就写错了。 所以该日志库似乎也不是个好的方案 |
27 rocmax 2024-03-01 18:24:03 +08:00 via Android ![]() |
28 myon 2024-03-02 15:29:14 +08:00 用 pm2 启服务,docker 映射 pm2 日志目录 |