Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 从多进程docker容器进行日志记录_Logging_Nginx_Process_Docker - Fatal编程技术网

Logging 从多进程docker容器进行日志记录

Logging 从多进程docker容器进行日志记录,logging,nginx,process,docker,Logging,Nginx,Process,Docker,对于我想在“docker日志”中显示的任何日志文件,我都使用nginx方法将其符号链接到/dev/stdout,但是这不起作用 我在/etc/crontab中用一个简单的cronjob测试了这一点,如果存在符号链接(指向/dev/stdout),它不会写任何东西(据我所知),但是如果我删除了符号链接,它会写入文件 另外,如果我回显到/dev/stdout,它会回显到命令行上,但是在“docker日志”中找不到它 问题:这是否有效?(它似乎与nginx一起工作)。否则,我将如何从“辅助”进程获取日

对于我想在“docker日志”中显示的任何日志文件,我都使用nginx方法将其符号链接到/dev/stdout,但是这不起作用

我在/etc/crontab中用一个简单的cronjob测试了这一点,如果存在符号链接(指向/dev/stdout),它不会写任何东西(据我所知),但是如果我删除了符号链接,它会写入文件

另外,如果我回显到/dev/stdout,它会回显到命令行上,但是在“docker日志”中找不到它

问题:这是否有效?(它似乎与nginx一起工作)。否则,我将如何从“辅助”进程获取日志以显示在docker日志中

参考:

显示符号链接方法的Nginx Dockerfile:

为此创建了正式的错误报告:

我的Dockerfile:

FROM ubuntu:trusty
#FROM quay.io/letsencrypt/letsencrypt:latest # For testing

ENV v="Fri Jan 22 10:08:39 EST 2016"

# Setup the cronjob
ADD crontab /etc/crontab
RUN chmod 600 /etc/crontab

# Setup letsencrypt logs
RUN ln -sf /dev/stdout /var/log/letsencrypt.log
# Setup cron logs
RUN ln -sf /dev/stdout /var/log/cron.log
RUN ln -sf /dev/stdout /var/log/syslog

# Setup keepalive script
ADD keepalive.sh /usr/bin/keepalive.sh
RUN chmod +x /usr/bin/keepalive.sh

ENTRYPOINT /usr/bin/keepalive.sh
crontab文件:

* * * * * root date >> /var/log/letsencrypt.log
keepalive.sh脚本

#!/bin/bash

# Start cron
rsyslogd
cron

echo "Keepalive script running!"

while true; do

    echo 'Sleeping for an hour...'
    sleep 10

done

好吧,评论中提到了它,但作为参考-我发现
docker
日志记录的最佳解决方案通常是依赖“标准”多系统日志记录机制-具体地说是
syslog

这是因为您可以在主机上使用内置的syslogd,或者将logstash用作syslogd。它有一个内置的过滤器,但实际上,由于不够灵活,它往往会受到一些影响,因此我使用TCP/UDP侦听器,并显式解析日志,如中所述

然后过滤日志:

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
    }
    syslog_pri { }
  }
}
这里的优点是-docker允许您使用
--link
--net
指定elasticsearch容器的名称,因此您可以将logstash配置别名为指向正确的位置。(例如,
docker-run-d--link my_es_container\u name:es tgt-p 514:514-p 514:514/udp mylogstash
或just
docker-net es_-net…

设置稍微复杂一些,因为您需要设置键值存储(我使用了
etcd
,但还有其他选项可用)。或者你可以做一些像库伯内特斯的事

然后使用
kibana
可视化,再次暴露kibana端口,但转发到elasticsearch网络与集群对话


但一旦设置完成,您就可以将
nginx
配置为,以及您希望常规捕获日志记录结果的任何其他内容。IMO的真正优势在于,您使用的是单一的日志记录服务,该服务可以根据您的需要进行扩展(感谢网络/集装箱化)

最终结果是cron作业的/dev/stdout指向了不同的设备

/proc/self/fd/1,应该是/proc/1/fd/1,因为docker只希望一个进程运行,这是它监视的唯一标准输出

因此,一旦我将符号链接修改为指向/proc/1/fd/1,它就应该可以工作了,但是apparmor(在主机上)实际上拒绝了请求(并在回显到/proc/1/fd/1时获得了权限错误),因为默认的docker配置文件(自动生成,但可以使用--security opts修改)

一旦越过apparmor障碍,一切都会成功

也就是说,在查看了apparmor中需要修改哪些内容以允许所需的请求后,我决定使用mkfifo方法,如下所示

Dockerfile

FROM ubuntu:latest

ENV v="RAND-4123"

# Run the wrapper script (to keep the container alive)
ADD daemon.sh /usr/bin/daemon.sh
RUN chmod +x /usr/bin/daemon.sh

# Create the pseudo log file to point to stdout
RUN mkfifo /var/log/stdout
RUN mkfifo /var/log/stderr

# Create a cronjob to echo into the logfile just created
RUN echo '* * * * * root date 2>/var/log/stderr 1>/var/log/stdout' > /etc/crontab

CMD "/usr/bin/daemon.sh"
daemon.sh

#!/bin/bash

# Start cron
cron

tail -qf --follow=name --retry /var/log/stdout /var/log/stderr

... 你的问题是什么?哈。。。谢谢,请看编辑!我已经放弃了在容器中管理日志,而是尝试通过logstash向elasticsearch提供尽可能多的日志。虽然有一点设置开销,但总体来说,它的痛苦要小得多。好的,作为一个替代方案,您有任何关于该设置的参考吗?接下来,我将集成一个ELK堆栈……您的“keepalive.sh”脚本是否运行cron守护程序?谢谢您的帮助,但我真正想要的答案是解决登录到/dev/stdout的主要问题。我想我现在可能已经有了,只是测试一下而已,没关系。你只是在评论中提到了它,所以我想我应该插手。提供的解决方案/proc/1/fd/1对我有效,但我遇到了“权限错误”,你能告诉我你是如何解决修改了--security opts的docker配置文件的吗?(回显到/proc/1/fd/1时获取权限错误)因为默认docker配置文件(自动生成,但可以使用--security opts进行修改。)需要知道为克服这些权限错误所做的更改。一段代码将有助于理解。
FROM ubuntu:latest

ENV v="RAND-4123"

# Run the wrapper script (to keep the container alive)
ADD daemon.sh /usr/bin/daemon.sh
RUN chmod +x /usr/bin/daemon.sh

# Create the pseudo log file to point to stdout
RUN mkfifo /var/log/stdout
RUN mkfifo /var/log/stderr

# Create a cronjob to echo into the logfile just created
RUN echo '* * * * * root date 2>/var/log/stderr 1>/var/log/stdout' > /etc/crontab

CMD "/usr/bin/daemon.sh"
#!/bin/bash

# Start cron
cron

tail -qf --follow=name --retry /var/log/stdout /var/log/stderr