通过Logspout路由docker容器日志

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

Logspout是一个运行在Docker容器中的程序,它可以将其所在主机上的其它Docker容器的日志路由到所配置的任何地方。它是一个无状态的容器化程序,并不是用来管理日志文件或查看日志的,它主要是用于将主机上容器的日志发送到其它地方。目前它只捕获其它容器中的程序发送到stdout和stderr的日志。

Logspout是一个很小的Docker容器,因为它是基于Alpine Linux构建的。如果没有特殊需求的话(如将日志路由到kafka,logstash等),需要先拉取官方镜像:

[yangdong@centos7 ~]$ docker pull gliderlabs/logspout:v3.1

然后通过将主机上的docker socket挂载到Logspout容器内部,来使其可以通过使用Docker API来将容器的日志发送到不同的终端:

[yangdong@centos7 ~]$ docker run --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
gliderlabs/logspout:v3.1 \
syslog+tls://logs.papertrailapp.com:55555

这里的日志目标终端是通过在启动logspout容器时传给容器内部的命令给出的(此处为syslog+tls://logs.papertrailapp.com:55555)。此URI告诉logspout将日志发送给位于logs.papertrailapp.com:55555的syslog程序,并且使用了tls加密传输选项。如果要指定多个日志目标终端,只需使用逗号将多个URI分隔开。
logspout容器将收集所有其它没有使用-t参数启动的容器,并且这些容器的日志驱动配置为系统默认的兼容journald和json-file的日志类型(即这些容器的日志可以通过docker logs命令查看)。
默认情况下,logspout会将它所在主机上所有满足前面条件容器的日志都进行路由,如果需要它忽略某个容器,可以在启动容器时设置环境变量-e 'LOGSPOUT=ignore',这样此容器的日志便会被logspout忽略。

通过使用logspout的httpstream module,可以通过curl时时查看logspout路由的日志,甚至可以不提供日志路由的URI:

[yangdong@centos7 ~]$ docker run -d --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--publish=127.0.0.1:8000:80 \
gliderlabs/logspout:v3.1 
[yangdong@centos7 ~]$ curl http://127.0.0.1:8000/logs

默认的logspout包含很多內建模块,可以通过编辑modules.go文件,重新构建logspout来增加或减少新的模块。如果需要将日志路由到kafka,logstash等程序,需要添加第三方模块来实现此功能。
下面通过实例将logspout-logstash这个第三方模块加入到logspout中。
https://github.com/andyyoung01/logspout-logstash/tree/test_branch/custom已经修改好了需要添加的模块,主要修改的文件如下:

modules.golink
1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import (
_ "github.com/gliderlabs/logspout/adapters/raw"
_ "github.com/gliderlabs/logspout/adapters/syslog"
_ "github.com/gliderlabs/logspout/httpstream"
_ "github.com/gliderlabs/logspout/routesapi"
_ "github.com/gliderlabs/logspout/transports/tcp"
_ "github.com/gliderlabs/logspout/transports/udp"
_ "github.com/gliderlabs/logspout/transports/tls"
_ "github.com/looplab/logspout-logstash"
)

上述文件的最后一行为添加的logspout-logstash模块,其它行为默认的模块。重新构建logspout后,可以通过指定环境变量ROUTE_URIS=logstash://host:port来给定logstash服务器的URI。例如:

[yangdong@centos7 ~]$ docker run --name="logspout" \
--volume=/var/run/docker.sock:/var/run/docker.sock \
-e ROUTE_URIS=logstash+tcp://logstash.home.local:5000 \
registry.cn-beijing.aliyuncs.com/andyyoung01/logspout-logstash

logstash默认使用UDP协议,上面指定URI时,通过在logstash协议后添加+tcp来切换成使用TCP协议。这样就可以将日志路由到logstash服务器上进行进一步的处理了。