我如何从日志文件而不是应用程序日志中输出日志

How do i output the logs from log file instead of application log

我在 Docker 中有一个 React 应用程序,在使用 Docker logs 命令时它显示这样的输出日志,即应用程序日志

NODE_ENV=production node ./build/server/index.js

2019-08-23T09:49:58.127Z - info: Application logs file: /root/.application.log Warning: connect.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process. 2019-08-23T09:49:58.192Z - info: HTTP server is now running on http://localhost:8080

我正在将实际日志写入名为 ui.log

的文件

06:51:32.021 INFO time="2019-08-23T06:51:32.021Z"

如何将此日志转发到 docker 日志中?

我在 Docker 文件

中尝试了这个命令 RUN ln -sf /dev/stdout /app/ui.log

但还是不行

您可以为此目的使用入口点,但请记住一件事,在这种情况下,npm 进程将 运行ning 在后台运行,拖尾日志文件将成为根目录进程 tail -f /root/applog.log

不建议在生产系统中使用,但您可以在开发中利用。

FROM node:alpine

COPY  . /root
WORKDIR /root
RUN echo $'#!/bin/sh \n\
npm run start & \n\
sleep 2 # give testServer time to create the newest log \n\
exec tail -f /root/applog.log ' >> /entrypoint.sh
RUN chmod 755 /entrypoint.sh
EXPOSE 3000
ENTRYPOINT [ "/entrypoint.sh" ]

该入口点在后台启动 npm,然后 运行 使用 exec 执行尾部。 exec 替换 pid 1 以便信号通过。

您可以进一步 here 来处理尾部的 PID,但不要忘记检查第一个答案的评论,这在您的情况下不起作用。

但在 Docker 的上下文中,将日志写入文件毫无用处,因为 docker 应该 运行 并终止,而不是保留日志文件。

另一件事,例如,如果您使用 AWS fargate,您不需要管理服务器到 运行 容器,因此您永远不会访问该文件,所以在那个case writing log to file 永远帮不了你

我建议在 Docker 的上下文中将所有日志写入控制台日志。

这里有一个教程,你可以在 nodejs 中按照这个教程来处理日志。

winston-logging-tutorial and using-winston-a-versatile-logging-library-for-node-js