在公司内部做对于docker日志系统,之前调研了logstash,flume,fluentd,logspout等项目,其中logstash,flume是不支持对于docker的日志采集的,后来发现了fluentd最后搭建起来发现fluentd把docker集成起来感觉非常麻烦,远远满足不了现在的业务需求,而且fluentd也安装起来也非常到,也满足不了对于灵活部署更新的需求,后来在github上面发现了logspout这个项目,非常简单只针对docker日志采集,也非常小,基于微镜像打包只有十几兆,后来针对logspout进行了一系列的业务方面的开发,当大规模用到公司内部运维平台上发现还是没有那么稳定,在这种情况下发现了heka。

  heka是mozilla开源的一个日志收集工具,提供的功能比较丰富。heka是一个高可扩展的日志收集处理工具,他的高可扩展不但体现在本身可以进行插件开发,而且还可以通过添加机器进行水平扩展。heka是go语言开发的,比较充分的运用的heka的并发机制,从我们对go语言特性了解来看,不用担心它的性能问题,即使如此我们也可以通过快速的水平扩展来满足业务的需求。

  heka和logstash一样同样有input进行日志采集,output发送日志,中间同样提供了filter splitters decoders等功能。下面我们就说说如何使用heka:

  

  这里我使用的是机器是ubuntu:14.04环境,首先要安装编译heka的环境。

  

  apt-get update && \

        apt-get install -yq --no-install-recommends \

        build-essential \

        bzr \

        ca-certificates \

        cmake \

        curl \

        git \

        golang-goprotobuf-dev\

        make \

        mercurial \

        patch \

        ruby-dev \

        protobuf-compiler \

        python-sphinx \

        wget \

        debhelper \

        fakeroot \

        libgeoip-dev \

        libgeoip1 \

        golang-goprotobuf-dev


  克隆heka项目 git clone https://github.com/mozilla-services/heka.git

  cd heka进入到heka下面执行 source build.sh && make deb && dpkg -i heka_0.11.0_amd64.deb

  这里看以看到执行的命令分为三步,我为了快速直接写成了一条命令,第一步是编译heka的代码,第二部是把heka的编译后的文件打包成deb包,第三部大家都明白是把heka安装到机器上。

  安装上以后可以发现在机器上有了hekad命令。我建了一个heka的配置文件在/etc/heka/conf.d下面udp.toml

  

[DockerLogInput]

endpoint = "unix:///var/run/docker.sock"


[RstEncoder]


[PayloadEncoder]


#[LogOutput]

#message_matcher = "TRUE"

#encoder = "PayloadEncoder"

##encoder = "RstEncoder"


[UdpOutput]

message_matcher = "TRUE"

encoder = "PayloadEncoder"

#encoder = "RstEncoder"

address = "10.3.11.19:5506"

 这个配置文件可以看到DockerLogInput是通过docker的api采集的docker的日志,UdpOutput是把采集的日志通过udp协议的方式发向一个address,这里heka的采集的信息是非常全的包括container的ID,NAME等信息都有,如果需要所有的信息可以用RstEncoder,如果只需要docker屏幕打印的输出日志可以用PayloadEncoder。