目前,我们将所有应用程序日志从多个容器重定向到stdout,并通过主机中的rsyslog将/ var / log / message收集到ELK堆栈。
所有docker容器日志显示为docker / xxxxxxxx,我们无法分辨这个日志的应用程序,无论如何我们可以轻松地将应用程序与docker stdout中的多个容器日志区分开来?
答案 0 :(得分:17)
(OS X的说明,但应该在Linux中运行)
使用docker命令似乎没有办法做到这一点,但是在bash中你可以同时运行多个命令,而使用sed
你可以在你的容器名称前加上前缀。
docker logs -f --tail=30 container1 | sed -e 's/^/[-- containerA1 --]/' &
docker logs -f --tail=30 container2 | sed -e 's/^/[-- containerM2 --]/' &
您将同时看到两个容器的输出。
[-- containerA1 --] :: logging line
[-- containerA1 --] :: logging line
[-- containerM2 --] :: logging line
[-- containerM2 --] :: logging line
[-- containerA1 --] :: logging line
[-- containerA1 --] :: logging line
[-- containerM2 --] :: logging line
[-- containerM2 --] :: logging line
立即拖尾所有容器:
#!/bin/bash
names=$(docker ps --format "{{.Names}}")
echo "tailing $names"
while read -r name
do
# eval to show container name in jobs list
eval "docker logs -f --tail=5 \"$name\" | sed -e \"s/^/[-- $name --] /\" &"
# For Ubuntu 16.04
#eval "docker logs -f --tail=5 \"$name\" |& sed -e \"s/^/[-- $name --] /\" &"
done <<< "$names"
function _exit {
echo
echo "Stopping tails $(jobs -p | tr '\n' ' ')"
echo "..."
# Using `sh -c` so that if some have exited, that error will
# not prevent further tails from being killed.
jobs -p | tr '\n' ' ' | xargs -I % sh -c "kill % || true"
echo "Done"
}
# On ctrl+c, kill all tails started by this script.
trap _exit EXIT
# For Ubuntu 16.04
#trap _exit INT
# Don't exit this script until ctrl+c or all tails exit.
wait
要阻止他们运行fg
,然后按ctrl+c
为每个容器。
更新:感谢@ Flo-Woo支持Ubuntu 16.04
答案 1 :(得分:1)
你有没有看过fluentd?这可能就是你所需要的。
答案 2 :(得分:0)
为什么依靠/ var / log / messages日志来获取应用程序日志?在我看来,您的应用程序日志应该是独立的。
假设您有一个java,ruby,python,node,golang app(Whatever),那么您可以将容器中的日志泵入/var/log/myapp/myapp.log。在容器中运行您的日志forwarder,以便在/var/log/myapp/myapp.log下将所有内容发送给ELK
通常托运人会根据HOSTNAME
env变量将主机名显示为您的container_id。例如:
[user@1dfab5ea15cd ~]# env | grep HOSTNAME
HOSTNAME=1dfab5ea15cd
[user@1dfab5ea15cd ~]#
您还可以使用Beaver或log-courier之类的内容来发送日志。
如果担心磁盘空间,您可以旋转日志并删除旧日志。
因此,如果要使用docker logs
命令重定向到STDOUT和STDERR,您将使应用程序编写标识容器/应用程序的日志。 (容器可能是主机名)但您可以重定向到主机上的/var/log/app/application.log
。类似的东西:
containerid/<hostname>-application: INFO: <message>
不要以为还有其他任何方式...
您也可以切换到Fluentd而不是Logstash作为另一种选择。
答案 3 :(得分:0)
这是一个尾随所有docker容器的脚本。
基于answer by @nate,但要短一些。在CentOS上进行了测试。
#!/bin/bash
function _exit {
kill $(jobs -p)
}
trap _exit EXIT
for name in $(docker ps --format "{{.Names}}"); do
eval "docker logs -f --tail=5 \"$name\" | sed -e \"s/^/[-- $name --] /\" &";
done
wait