【问题标题】:Logging from multiprocess docker containers从多进程 docker 容器记录
【发布时间】:2016-04-29 06:36:19
【问题描述】:

我正在使用 nginx 符号链接方法来链接到 /dev/stdout 来处理我想出现在“docker logs”中的任何日志文件,但这不起作用。

我已经在 /etc/crontab 中使用一个简单的 cronjob 对此进行了测试,如果存在符号链接(指向 /dev/stdout)它不会写任何东西(据我所知),但如果我删除符号链接并写入文件。

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

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

参考:

Nginx Dockerfile 显示符号链接方法:https://github.com/nginxinc/docker-nginx/blob/a8b6da8425c4a41a5dedb1fb52e429232a55ad41/Dockerfile

为此创建了一个官方错误报告:https://github.com/docker/docker/issues/19616

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

【问题讨论】:

  • ...你有什么问题?
  • 哈...谢谢你,看看编辑!
  • 我已经放弃了在容器中管理日志,而是尝试尽可能多地通过 logstash 向 elasticsearch 提供数据。虽然有一些设置开销,但总体而言它的痛苦要小得多。
  • 好的,那么作为替代方案,您对那个设置有任何参考吗?无论如何,我打算集成一个 ELK 堆栈...
  • 您的“keepalive.sh”脚本是否运行 cron 守护进程?

标签: logging nginx process docker


【解决方案1】:

嗯,它在 cmets 中提到过,但仅供参考 - 我发现 docker 日志记录的最佳解决方案通常是依赖“标准”多系统日志记录机制 - 特别是 syslog 尽可能。

这是因为您既可以使用主机上的内置 syslogd,也可以使用 logstash 作为 syslogd。它有一个内置的过滤器,但实际上这往往会因为不够灵活而受到影响,所以我使用 TCP/UDP 侦听器,并明确解析日志 - 如"When logstash and syslog goes wrong"中所述

input {
  tcp {
    port => 514
    type => syslog
  }
  udp {
    port => 514
    type => syslog
  }
}

然后过滤日志:

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 { }
  }
}

然后,您可以将此 logstash 提供给 elasticsearch - 在远程主机、本地容器上或我现在正在做的是带有多节点 elasticsearch 实例的docker network。 (我已经使用下载和 docker 文件推出了自己的文件,但我很确定也存在独立容器)。

output { 
   elasticsearch {
      hosts => [ "es-tgt" ]
   }
}

这里的优点是 - docker 允许您使用 --link--net 来指定您的弹性搜索容器的名称,因此您可以为 logstash 配置设置别名以指向正确的位置。 (例如docker run -d --link my_es_container_name:es-tgt -p 514:514 -p 514:514/udp mylogstash 或只是docker run --net es_net ....

docker network 设置稍微复杂一些,因为您需要设置一个键值存储(我使用了etcd,但还有其他选项可用)。或者你可以做一些类似 Kubernetes 的事情。

然后使用kibana 进行可视化,再次暴露kibana 端口,但转发到elasticsearch 网络与集群通信。

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

【讨论】:

  • 谢谢你,但我真的很想得到一个解决登录到 /dev/stdout 的主要问题的答案。我想我现在可能有,只是测试一下
  • 没关系。你只是在 cmets 中引用它,所以我想我会加入。
【解决方案2】:

最终结果是 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

【讨论】:

  • 提供的解决方案 /proc/1/fd/1 为我工作但我一直停留在“权限错误”,您能否让我知道您如何解决使用 --security- 修改的 docker 配置文件选择? (回显到 /proc/1/fd/1 时出现权限错误)因为默认的 docker 配置文件(自动生成但可以使用 --security-opts 修改)。)需要知道哪些更改适用于获取在这些权限错误。一段代码有助于理解。
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 2023-03-15
  • 2017-03-10
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2018-11-09
  • 2018-04-05
相关资源
最近更新 更多