【问题标题】:Run an executable and read logs at the same time同时运行可执行文件和读取日志
【发布时间】:2021-12-02 06:16:18
【问题描述】:

我有一个场景,我从 docker 容器运行可执行文件(作为入口点)。
问题是,该可执行文件不会将日志写入标准输出,而是写入文件。

我需要一种在前台运行该可执行文件的方法(这样,如果它崩溃,它也会使容器崩溃),但同时将日志从文件传输到标准输出。

有什么建议吗?

【问题讨论】:

  • 你能提供你正在运行的命令吗?
  • 你不能把一个卷挂载到正在写入日志文件的地方吗?
  • @Paolo 我可以,但我需要标准输出中的日志(这是我们的日志系统捕获它们的唯一方法)
  • 您是否可以控制此图像的构建方式还是您只是给它?
  • @seqre 我基本上有这个程序(我无法控制它的源代码),我从命令行ENTRYPOINT ["myprogram"] 运行,它将日志写入/var/log

标签: bash docker unix


【解决方案1】:

Linux 环境提供了几个特殊文件,它们实际上传递给其他文件描述符。如果将日志文件设置为/dev/stdout或/dev/fd/1,它实际上会出现在主进程的stdout上。

Docker Hub nginx image 在这方面有一个巧妙的变化。如果您查看它的Dockerfile,它会指定:

RUN ln -sf /dev/stdout /var/log/nginx/access.log

Nginx 应用程序配置将其日志文件指定为/var/log/nginx/access.log。如果您什么都不做,那是指向/dev/stdout 的符号链接,因此访问日志会出现在docker logs 输出中。但是,如果您希望将日志保存在文件中,您可以在 /var/log/nginx 上绑定挂载主机目录,然后您将在主机上以文件形式获得 access.log。

【讨论】:

  • 我无法控制程序记录到哪个文件,但你是说我可以将其符号链接到/dev/stdout?
  • 经过测试,它完成了工作!
【解决方案2】:

祝你好运!
好吧,你的问题很笼统/抽象(正如 David Maze 提到的,你没有说确切的命令是什么,也没有说你是如何运行它们的),但我想我明白了。

您将执行以下操作:

# if the command logs to the stdout, do:
command &> /var/tmp/command.log &
tail -f /var/tmp/command.log
# if the command logs to an specific file in, idk, /var/adm, do:
tail -f /specific/file/directory/command.log

我不会自己解释tail -f,而是引用tail(1p) manual page:

-f如果输入文件是常规文件或者文件操作数指定了FIFO,则不要在输入文件的最后一行之后终止 已被复制,但在输入文件可用时从输入文件中读取和复制更多字节。如果没有指定文件操作数并且 标准输入是管道, -f 选项应被忽略。如果输入文件不是 FIFO、管道或常规文件,则未指定 是否应忽略 -f 选项。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多