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

263 天前
 rizon

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

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

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


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

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

`docker inspect mysql | grep 'LogPath'`
rocmax
262 天前
实际上使用 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.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1019450

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX