我在Docker中有一个React应用程序,在使用Docker logs命令时,它显示了这样的输出日志,即应用程序日志
NODE_ENV =生产节点./build/server/index.js
2019-08-23T09:49:58.127Z-信息:应用程序日志文件:/root/.application.log 警告:connect.session()MemoryStore不是 为生产环境而设计,因为它会泄漏 内存,并且不会扩展到单个进程。 2019-08-23T09:49:58.192Z-信息:HTTP服务器现在在http://localhost:8080上运行
我正在将实际日志写入名为ui.log的文件
06:51:32.021 INFO time =“ 2019-08-23T06:51:32.021Z”
如何将此日志转发到docker日志中?
我在Dockerfile中尝试了此命令RUN ln -sf /dev/stdout /app/ui.log
但仍然无法正常工作
答案 0 :(得分:2)
您可以为此使用入口点,但是要记住,在这种情况下,npm
进程将在后台运行,而尾随日志文件将成为根进程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,则无需管理服务器即可运行容器,因此永远不会访问该文件,因此在这种情况下,将日志写入文件永远不会帮助你。
我建议在Docker上下文中将所有日志写入控制台日志。
这是您可以在nodejs中处理日志的教程。
winston-logging-tutorial和using-winston-a-versatile-logging-library-for-node-js