我是用的 dockercompose 部署的,每次 docker up 都会重新创建镜像,日志自然也删除了。
项目的启动命令是:node server.js , 这种情况下,有什么简单的日志持久化的方法啊。

我的问题没有描述清楚,首先我的 nextjs 项目日志默认打印到控制台,我不知道有什么工具可以简单的配置一下让日志在往控制台打印的同时还能输出到文件。第二,如果在 docker 的配置里把服务的控制台日志重定向到文件(node server..js 2>&1 > run.log),就会导致 docker 的 logs 命令以及第三方的工具无法直接按照 docker 的规范读取控制台日志了。我还是希望保持日志输出到控制台的同时再采集日志到文件。

volumes: - ./log:/app/log

EFK

grafana loki promtail

或者可以直接走 docker 的 log-driver 到 loki

用一楼老哥的方法,你挂一个 volume 持久化到本地就可以了

装个 loki ,应用直接把日志打到 stdout ,用 docker 的 loki 插件把 stdout 的日志转发到 loki 就行了

你日志放容器肯定不行吧 怎么说也应该挪到外面

挂在出来呗

你甚至可以在容器里配置 rsyslog 向 syslog 服务器发送日志,通过环境变量把服务器地址传进容器

服务器是房子,镜像是人,日志是家具,人走了不可能带走家具吧?家具肯定还在房子里。所以日志放服务器上,具体怎么放,搜 docker volumes

#1 #5 #8 #10 是我的问题,我没有描述清楚诉求,首先我的 nextjs 项目日志默认打印到控制台,我不知道有什么工具可以简单的配置一下让日志输出到文件。第二,如果在 docker 的配置里把服务的控制台日志重定向到文件(node server..js 2>&1 > run.log),就会导致 docker 的 logs 命令以及第三方的工具无法直接按照 docker 的规范读取控制台日志了。

如果是为了控制台能查看日志并保存到文件持久化,可以简单使用 tee 命令。node server.js 2>&1 | tee app.log

导入一个 log 库,想传哪就传哪比如pino

#12 这个不行的,tee 只在进程结束后才写日志,不是实时的。 #13 这个库看着不错,就是要改造一下代码了。好像也没更简单的办法了

Docker 的部署启动的项目,无论 Java nodejs 啥的,日志直接打印到控制台,有专门收集 Docker 日志的工具,像 Vector( vector.dev/docs/reference/configuration/sources/docker_logs/),你所需要做的就是把这种日志收集工具按你的需求配置好就行了,很简单的,对项目无侵入

#12 可能是我配置的问题,测了一下 tee 应该是能用的。不考虑日志滚动的情况下,这个我感觉是成本最低的方案了,我再试试。

你已经在用容器了, "让 nextjs 多写一份 log 到文件" 属于自己创造问题正确途径是学习使用 docker logging driver然后把 log 流到专门接收 log 的东西, 比如我自己在用的 fluent-bit有了这种东西多保存一份到文件也可以, 再转发到别的 log 存储也可以

fluentd 这种就行了,无论是 k8s 还是 docker 都有主流日志收集方案

docker 不是默认会按 json-log 的形式把它写入到文件么~~docker inspect mysql | grep 'LogPath'

实际上使用 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.

当然这根容器外部收集方案不冲突

nestjs 用的比较多的是这个 www.npmjs.com/package/winston ,搜一下有很多集成案例。

#20 打算换成 #13 推荐的这个 pino

#23 #22 这个库也不错啊,我看看这个

Winston 是老牌 log 库了,服务器端使用没问题。nextjs 使用的话有一个问题是 Winston 依赖于 node 环境,nextjs 的 middleware 运行在 edge 环境

#25 我是自己服务器托管运行的,倒是没有这个问题,但是你这到提醒我了,nextjs 项目里还有跑在客户端的代码,我日志配置起来有些麻烦,还要分开服务端和客户端写代码,一不小心就写错了。 所以该日志库似乎也不是个好的方案

vercel.com/templates/next.js/pino-logging两边都可以用