我正在按照12要素咨询意见来部署第三方应用程序,其中之一是告诉应用程序日志应打印到stdout / stderr:然后集群软件可以收集它。 ,应用程序只能写入文件或syslog。我该如何打印这些日志?

评论

他们已经准备进入syslog。您可以从那里拿起它们!

@MichaelHampton看起来不错,但是Docker运行一个可以写入stdout的进程,这听起来像是将其中的两个结合起来了?

您可以让守护进程使用syslog并拥有可以打印的前端进程吗?

@qkrijger,好点!现在,如果有人有经验...?

#1 楼

nginx Dockerfile中给出了一个惊人的配方: &stdout

评论


这个。是的。只是。辉煌。而且用途广泛。

–spacediver
2014年11月15日23:24



与此有关的一件事是,当您正在运行的事物坚持以非根进程的形式将自身派生到后台时。我在squid3中遇到了这个问题,然后在/ dev / stdout的权限上遇到了麻烦。

–mikepurvis
2014年12月17日下午3:51

这并不总是有效-例如,如果应用程序尝试查找文件,则此方法通常将不起作用。

– mixja
16年5月24日在11:45

一切都是胜利的档案。

–RubberDuck
17年7月15日在20:12

请注意,这在大多数情况下都有效,但是,如果您执行日志记录的应用程序未以PID 1的身份运行,则日志将不会重定向到Docker读取的标准输出。

–leeman24
19-10-31在15:34

#2 楼

对于Docker容器中的后台进程,例如将exec与exec连接到我能够使用的/ bin / bash。

评论


这是正确的答案。日志应发送到PID1的stdout,如果您的应用程序在其他PID下运行,则docker日志或kubectl日志将看不到该日志。我有一个通过crontab计划任务的容器,该容器未作为PID1运行。

–leeman24
19-10-31在15:33

#3 楼

在另一个问题中,当父进程退出时杀死子进程,我得到了有助于解决该问题的响应。通过这种方式,我们配置了应用程序,使其记录到文件中,并连续地对其进行查询。
幸运的是,tail -f可以接受tail:当指定的进程退出时它将退出。我们将--pid PID放在这里:当前shell的PID。

最后一步,启动的应用程序是$$'ed,这意味着当前shell被该应用程序完全替换。
< br Runner脚本exec看起来像这样:

最后,使用简约的Dockerfile:替换为远程文件。放弃该名称”)我尝试了另一种方法:所有已知的日志文件在启动时都会创建并被截断:这样我可以确保它们存在,然后-尾随它们: br />
#! /usr/bin/env bash
set -eu

rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &

exec /path/to/my-application --logfile /var/log/my-application.log


评论


特别是对于Apache服务器,我正在使用管道日志(httpd.apache.org/docs/2.4/logs.html#piped),看起来像是可以正常工作。

– PHP编码器
2015年10月9日,9:49

该解决方案可以解决与alpine类似的问题,并且在不使用--pid选项的情况下,在BusyBox尾部上也可以正常工作。

–瑞安
18/12/10在2:12

解决方法对我有用。非常有用,谢谢。

– Tamas Kalman
19 Mar 18 '19在23:49

尽管这在Docker上非常有效,但不适用于Kubernetes!我不知道为什么,但是豆荚的容器缺少尾巴处理...

–ZedTuX
20 Dec 10'在8:56

#4 楼

对于Nginx,您可以像这样将nginx.conf指向/dev/stderr/dev/stdout

user  nginx;
worker_processes  4;
error_log  /dev/stderr;
http {
    access_log  /dev/stdout  main;
...


,您的Dockerfile条目应为

/usr/sbin/nginx -g 'daemon off;'


评论


当主进程未以root身份运行时不起作用

–步行者
18年12月14日10:00