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

时间:2019-08-23 10:32:47

标签: reactjs docker logging containers

我在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

但仍然无法正常工作

1 个答案:

答案 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-tutorialusing-winston-a-versatile-logging-library-for-node-js