logging同一主机上运行的多个容器的解决scheme

目前我们将所有应用程序日志从多个容器redirect到stdout,并通过主机中的rsyslog将/ var / log / message收集到ELK堆栈中。

所有的docker容器日志显示为docker / xxxxxxxx,我们不能告诉哪个应用程序是这个日志,无论如何,我们可以很容易地从docker stdout区分应用程序和多个容器日志?

(有关OS X的说明,但应在Linux中运行)

似乎没有办法用docker命令来做到这一点,但是在bash中,你可以同时运行多个命令,而在sed你可以用你的容器名称作为前缀。

 docker logs -f --tail=30 container1 | sed -e 's/^/[-- container1 --]/' & docker logs -f --tail=30 container2 | sed -e 's/^/[-- container2 --]/' & 

你将会同时看到两个容器的输出。

 container1 :: logging line container1 :: logging line container2 :: logging line container2 :: logging line container1 :: logging line container1 :: logging line container2 :: logging line container2 :: 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的支持

你看过fluentd吗? 这可能是你需要的。

你为什么依靠你的应用程序日志的/ var / log / messages日志? 在我看来你的应用程序日志应该是独立的。

假设你有一个java,ruby,python,node,golang应用程序(Whatever),那么你可以将容器中的日志泵入/var/log/myapp/myapp.log。 在您的容器中运行您的日志转发器以运送到/var/log/myapp/myapp.log下的所有ELK

通常,托运人将根据HOSTNAME envvariables显示主机名作为您的container_id。 例如:

 [user@1dfab5ea15cd ~]# env | grep HOSTNAME HOSTNAME=1dfab5ea15cd [user@1dfab5ea15cd ~]# 

您也可以使用像海狸或日志信使来运送您的日志。

如果担心磁盘空间,可以旋转日志并摆脱旧日志。

所以如果你想使用docker logs命令redirect到STDOUT和STDERR,你将会让你的应用程序写一些标识容器/应用程序的日志。 (Container可能是主机名)但是你可以在主机上redirect到/var/log/app/application.log 。 就像是:

 containerid/<hostname>-application: INFO: <message> 

别以为有别的办法

您也可以切换到Fluentd而不是Logstash作为另一个选项。