对于,大规模运行的容器集群来说,日志不能集中管理是一件很痛苦的事情。不能合理的收集,管理检索应用日志,在应用发生了故障的时候将无法很好的追溯问题发生的原因。
docker日志收集目前的方案较多,本文就不去探究究竟是那种方案更好。目前开源elk的日志收集技术堆栈使用的较为广泛,各大互联网公司也有机遇elk技术栈进行日志收集的案例。其中,elk种的logstash,是用来收集,格式化,然后将日志存入elasticsearch中,供查询统计。本文,即将讨论的是,使用fluentd替换elk中的logstash。这里就不详细展开讨论fluentd和logstash孰优孰劣。为了,使docker的日志能够存储到elasticsearch,需要解决的就是如何导出docker的日志。
查看,docker文档,docker支持使用fluentd作为容器日志的driver。下面,就来详细的说明,如何安装fluentd,并配置docker使用fluentd在存储日志。step by step。

1)步骤1:安装fluentd
配置运行环境
1. 使用ntp通过各个节点的时间,以便各个节点记录的日志时间戳保持一致
2. 设置文件描述符的数量至65536。 可以使用ulimit -n查询当前支持的最大。如果不是65536,可以修改/etc/security/limits.conf 中的”root soft nofile”,”root hard nofile”数值至65536,然后reboot操作系统
3. 优化内核网络参数。/etc/sysctl.conf

    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.ip_local_port_range = 10240    65535

2)安装fluentd (本文仅仅给出了rhel/centos)

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl  start td-agent

flutend安装完成后,默认的配置文件路径在/etc/td-agent/td-agent.conf。
4) 测试
td-agent默认将配置收集来自http的日志,并将日志转储到/var/log/td-agent/td-agent.log

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

如果在,/var/log/td-agent/td-agent.log中看到了2016-03-26 11:50:29 +0800 debug.test: {“json”:”message”} 则表明fluent安装成功。至此,fluent安装完成。下面,
配置看看,如果配置docker将日志转发给fluted。

步骤2: 配置fluent接收docker日志
在/etc/td-agent/td-agent.conf中增加,并重启td-agent,systemctl restart td-agent

      <match docker.**> 
          type stdout
      </match>

步骤3: 配置docker使用fluent为log-driver
配置docker转储日志有两种方法,指定特定的容器或者配置docker daemon将所有容器日志均存储到fluent中。
方法1:指定容器

docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224

方法2: 设置全局log-driver

docker daemon --log-driver=fluentd

至此,已经成功将docker的日志交给fluent处理。接下来的工作是,配置将fluent的日志转发给elasticsearch进行处理。

参考:
http://docs.fluentd.org/articles/install-by-rpm
https://docs.docker.com/engine/admin/logging/fluentd/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐