高效的监控和日志管理对保持生产系统持续稳定的运行以及排查问题至关重要。

   在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要。考虑到容器短暂和不固定的生命命周期,当我们需要debug问题时有些容器可能不存在了。因此,一套集中式的日志管理系统是生产环境中不可缺的组成部分

一、docker logs

    默认配置下的docker日志功能。对于一个运行的容器,docker会将日志发送到容器的 标准输出设备STDOUT和标准错误设备(STDERR),stdout和stderr实际上就是容器的控制台终端

   我们在启动日志的时候没有用-d 参数,httpd容器以前台方式启动,日志会直接打印在当前的终端窗口。如果加上-d 参数以后台方式运行容器,我们就看不到输出的日志。

   这个情况如果要查看容器的日志:

     1.attach到该容器

docker attach webb

 attche到了nginx容器,没有任何输出,那是因为他只能看到attche进入后所产生的日志,可以在另一台查看网页数据。这事 attache的终端就会打印出新的日志。

  attache的方法在实际上使用不方便,因为:

        1.只能看到attache之后的日志,以前的日志不可见。

        2.退出attach状态比较麻烦(ctry+p然后ctry+q组合键),一不小心很容器将容器杀掉(crtl+c)查看容器日志推荐的方法是用docker logs命令

 2.docker logs 命令查看日志。

docker logs  -f test

  docker logs能够打印出自容器启动以来完整的日志,并且 -f 参数可以继续打印出新生产的日志,效果上与linux命令 tail -f 一样

二、docker支持多种日志方案

    将容器日志发送到stdout和stderr是docker的默认日志行为。实际上,docker提供了多种日志机制帮助用户从运行的容器中提取日志信息,这些机制被称作logging driver 

    1. docker默认logging driver是json-file

docker info  |  grep 'Logging Driver'

    2.如果容器在启动时没有特别指明,就会使用这个默认的logging driver json-file会将容器的日志保存在json文件中,docker负责格式化其内容并输出到stdout和stderr。我们可以在host的容器目录中找到这个文件,容器路径为:

docker container  inspect  webb | grep 'LogPath'

3.除了json-file docker还支持多种logging driver,完整列表可访问官方文档

4.容器启动时可以通过 --log-driver指定使用logging driver 。如果要设置docker默认的logging driver,需要修改docker daemon的启动脚本,指定--log-driver参数

docker run --log-driver  none  -p 80:80 -dit --name test   nginx  (none不支持日志读取)

或者

vim /usr/lib/systemd/system/docker.service (修改配置文件)

ExecStart=/usr/bin/dockerd -H fd:// --log-driver=none  

四、初探elk

   在开源的日志管理方案中,最出名的莫过于elk了

   一)、elk是三个软件的合成elasticsearch、logstash、 kibana。

  1.elasticsearch

       一个近乎实时查询的全文索引引擎,elasticsearch的设计目标就是能够处理和搜索巨量的日志数据

  2.logstash

     一个近乎实时查询的全文索引 ,elasticsearch的设计目标就是要能够处理和搜索巨量的日志数据。

  3. kibana

     一个基于javascript 的web图形界面程序,专门用于可视化elasticsearch的数据,kibana能够查询elasticsearch并通过丰富的图表展示结果,用户可以创建dashboard来监控系统的日志。

   二)、日志处理流程:

        

    三)、安装elk套件

        环境:

                1.docker至少的分配3GB内存;

                2.elasticsearch至少需要单独2G的内存;

                3.防火墙开放相应端口

                4.vm.max_map_count至少需要262144 附永久修改vm.max_count方法如下:

vim  /etc/sysctl.conf

vm.max_map_count = 262144

 sysctl  -p (查看)

  1.安装docker elk

          执行命令 :

docker pull sebp/elk

   2.以下命令启动堆栈,运行具有2GB堆大小的elasticsarch和具有1GB堆大小的logstash:

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -itd -e ES_HEAP_SIZE="2G" -e LS_HEAP_SIZE="1G" --name elk sebp/elk

  此命令发布以下端口,这些端口是正在操作elk堆栈所需的:

       5601 (kibana  web界面)

       9200 (elasticsearch JSON接口)

      5044(logstash beats界面,从beats接收日志,如filebeat)

    3.打卡浏览器输入:192.174.1.5:5601

    

 五、ELK完整部署和使用 

    1.安装filebeat

curl  -L  -O  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm

rpm -vih filebeat-7.7.0-x86_64.rpm

    2.配置filebeat

             filebeat的配置文件为/etc/filebeat/filebeat.yml,我们需要告诉filebeat两件事

                  监控哪些日志文件?

                  将日志发送到哪里

   ①  修改日志收集目录

vim /etc/filebeat/filebeat.yml


- /var/lib/docker/comtainers/*/*.log
- /var/log/messages

 ②添加elasticsearch服务器地址

 ③添加kibana服务器地址

 3.启动elasticsearch模块

filebeat modules enable elasticsearch

4.初始化filebeat

filebeat setup

5.启动filebeat

 systemctl start filebeat.service

  启动容器 测试是否能够检测到日志

六、万能数据收集器

     前面的elk中我们是filebeat收集docker 容器,利用的是docker默认的logging driver   json-file

    fluentd是一个开源的数据收集器,它的目前有超过500种的plugin 可以连接各种数据源和数据输出组件。

    处理流程如下:

        

1.安装fluentd

docker pull fluent/fluentd

 docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd

2.重新编辑配置文件/etc/filebeat/filebeat.yml 将/data添加到监控路径中,删除其他的输入日志即可

3.重启filebeat

systemctl restart filebeat

4.监控容器日志,启动测试容器

 docker run -dit  --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="container-A"  busybox sh -c 'while true; do echo "this is a log from A"; sleep 10; done;'

docker run -dit  --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="container-B"  busybox sh -c 'while true; do echo "this is a log from B"; sleep 10; done;'


--log-driver=flunentd 告诉docker使用fluentd的logging driver
--log-opt fluentd-address=localhost:24224 将容器日志发送到fluentd的数据端口。
--log-opt tag="container-B" 在日志中添加一个可选的tag,用于用于区分不同容器

 5.容器启动后 kubana很快就能查到容器日志

Logo

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

更多推荐