资讯专栏INFORMATION COLUMN

使用ELK处理Docker日志(一)

singerye / 2796人阅读

摘要:编者的话产品经理为了纪念四岁生日,撰写一系列文章,介绍如何使用收集和处理环境日志。在将日志发送到的上下文中,使用日志驱动可能是最简单的方法。如果使用或日志记录驱动程序,则需要将定义为输入。

[编者的话] Daniel Berman ( Logz.io 产品经理)为了纪念 Docker 四岁生日,撰写一系列文章,介绍如何使用 ELK 收集和处理 Dockerized 环境日志。小数今天给大家带来的第一部分将介绍如何安装各个组件以及不同日志收集方案的特点,下一部分将侧重于分析和可视化,近期发出,记得关注我们噢~

PS :数人云工程师们已奔赴奥斯汀 DockerCON2017 现场,更多最佳实践后天为您奉上!

容器运行程序时产生的日志具有“无常,分布,隔离”等特点,因此在架构中收集 Docker 日志面临很大的挑战,有待尝试一种强有力的日志收集和处理方案来解决此类复杂问题。

ELK ( Elasticsearch , Logstash 和 Kibana )是处理容器日志的一种方式,尽管设置 ELK 工作流并不容易(难度取决于环境规格),但最终可以使用 Kibana 的监控面板来展示 Docker 日志:

.

为了纪念 Docker 四岁生日,我们将撰写一系列文章,介绍如何使用 ELK 收集和处理 Dockerized 环境日志。第一部分将介绍如何安装各个组件以及不同日志收集方案的特点,并建立从容器中收集日志的工作流,下一部分将侧重于分析和可视化。

日志收集的流程

Dockerized 环境中的典型 ELK 日志收集流程如下所示:

Logstash 负责从各种 Docker 容器和主机中提取日志,这个流程的主要优点是可以更好地用过滤器来解析日志, Logstash 将日志转发到 Elasticsearch 进行索引, Kibana 分析和可视化数据。

当然这个流程可以有多种不同的实现方式, 例如可以使用不同的日志收集和转发组件, 如 Fluentd 或 Filebeat 将日志发送到 Elasticsearch ,或者,添加一个由 Kafka 或 Redis 容器组成的中间层,作为 Logstash 和 Elasticsearch 之间的缓冲区。上图显示了日志从 Docker 到 ELK 的基本流程。

那么,如何设置这个流程呢?

组件安装

可以将 ELK 套件安装在一个容器里,也可以使用不同的容器来分别安装各个组件。

关于在 Docker 上部署 ELK 是否是生产环境的可行性解决方案(资源消耗和网络是主要问题)仍然存在很多争议,但在开发中这是一种非常方便高效的方案。

ELK 的 docker 镜像推荐使用 docker-elk, 它支持丰富的运行参数(可使用这些参数组合不同的版本)和文档, 而且完全支持最新版本的 Elasticsearch, Logstash, 和 Kibana.

在安装组件之前需要确保以下端口没有被占用:5601 (Kibana), 9200 (Elasticsearch), and 5044 (Logstash).

同时需要确保内核参数 vm_max_map_count 至少设置为 262144:

sudo sysctl -w vm.max_map_count=262144

To run the stack:

运行如下命令:

git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
docker-compose up

正常情况下, ELK 套件的三个服务(Elasticsearch, Logstash, Kibana)会启动成功,默认持久化数据目录 /var/lib/elasticsearch (Elasticsearch 的数据存储目录)

sudo docker ps

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES

73aedc3939ad        dockerelk_kibana          "/bin/sh -c /usr/l..."   7 minutes ago       Up 6 minutes        0.0.0.0:5601->5601/tcp                           dockerelk_kibana_1

b684045be3d6        dockerelk_logstash        "logstash -f /usr/..."   7 minutes ago       Up 6 minutes        0.0.0.0:5000->5000/tcp                           dockerelk_logstash_1

a5778b8e4e6a        dockerelk_elasticsearch   "/bin/bash bin/es-..."   7 minutes ago       Up 7 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   dockerelk_elasticsearch_1
测试安装组件

可通过如下的方式来确保所有组件都能正常运行。

首先尝试访问 Elasticsearch 运行如下命令:

curl localhost:9200

输出结果:

{
 "name" : "W3NuLnv",
 "cluster_name" : "docker-cluster",
 "cluster_uuid" : "fauVIbHoSE2SlN_nDzxxdA",
 "version" : {
   "number" : "5.2.1",
   "build_hash" : "db0d481",
   "build_date" : "2017-02-09T22:05:32.386Z",
   "build_snapshot" : false,
   "lucene_version" : "6.4.1"
 },
 "tagline" : "You Know, for Search"
}

打开 Kibaba 页面通过 http://[serverIP]:5601:

值得注意的是需要输入索引模式才能正常进行后续处理,这个稍后将会介绍。

发送 Docker 日志到 ELK

安装组件比较简单,相比而言将 Docker 日志发送到 ELK 有点复杂,这取决于输出日志的方式。

如果没有额外指定,容器的 stdout 和 stderr 输出(也称为“ docker logs ”)输出到 JSON 文件。所以,如果是一个小型 Docker 环境,使用 Filebeat 来收集日志将是不错的选择。但如果使用其他日志记录驱动程序,则可能需要考虑其他方法。

以下是将日志导入 ELK 的三种不同的方法,切记,这并不能包含所有的方案。

使用 Filebeat

Filebeat 属于 Elastic 的 Beats 系列日志收集组件, Filebeat 是用 Go 语言开发的,支持追踪特定文件和日志加密的中间组件,它可以配置将日志导出到 Logstash 或者直接导出到 Elasticsearch.

如上所述,若使用默认的 json 文件记录驱动程序, Filebeat 是一种相对简便的方式,可以输出日志到 ELK.Filebeat 部署在主机上,或将其作为容器与 ELK 容器一起运行(在这种情况下,需要添加到 ELK 容器的链接),这里有各种Filebeat Docker images可用,有些包括运行 Filebeat 并将其连接到 Logstash 的配置。

Filebeat 配置将需要指定 JSON 日志文件的路径(位于:/ var / lib / docker / containers / ...)和目标的详细信息(通常是 Logstash 容器)。

下面是一个配置的例子

prospectors:     
 - paths:        
   - /var/log/containers/          
   document_type: syslog     
output:
 logstash:  
  enabled: true  
  hosts:   
      - elk:5044
使用日志驱动

Docker 从 1.12 开始支持Logging Driver,允许将 Docker 日志路由到指定的第三方日志转发层,可将日志转发到 AWS CloudWatch , Fluentd , GELF 或 NAT 服务器。

使用 logging drivers 比较简单,它们需要为每个容器指定,并且将需要在日志的接收端进行其他配置。

在将日志发送到 ELK 的上下文中,使用 syslog 日志驱动可能是最简单的方法。

下面是一个指定 Logging Driver 的例子:

docker run 
 --log-driver=syslog 
 --log-opt syslog-address=tcp://:5000
  --log-opt syslog-facility=daemon
  alpine ash

如此这样运行每一个容器,结果是将 Docker 容器日志流输出到 syslog 实例,这些日志将转发到 Logstash 容器进行解析和数据增强,进入 Elasticsearch 。

使用 Logspout

Logspout 是 Docker 流行和轻量级的( 15.2MB )日志路由器,它将附加到主机中的所有容器,并将 Docker 日志流输出到 syslog 服务器(除非定义了不同的输出目标)。

sudo docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+tls://:5000

使用Logstash module直接将日志路由到 Logstash 容器,但这需要其他配置和编译工作。

Logz.io 的日志采集器

本人在 In this blog post这篇文章中介绍了 Logz.io 的日志采集器,像 Logspout 一样,它附加在 Docker 主机中的所有容器上,但它不仅运送 Docker 日志,还包含 Docker 统计信息和 Docker 守护程序事件。

docker run -d --restart=always -v /var/run/docker.sock:/var/run/docker.sock logzio/logzio-docker -t 

目前它是为 Logz.io ELK 套件的用户设计的,我们正在努力将它开源项目。

数据持久化

配置 Logstash 来解析数据至关重要,因为这部分过程将添加上下文到容器的日志中,并能够更轻松地分析数据。

在 Logstash 配置文件中需要配置三个主要部分:输入,过滤和输出。 (若运行的是 Logstash 5.x ,则该文件位于:/ usr / share / logstash / pipeline )

输入取决于日志传送方式,使用 Filebeat ,则需要指定 Beats 输入插件。如果使用 logspout 或 syslog 日志记录驱动程序,则需要将 syslog 定义为输入。

过滤器部分包含用于分解日志消息的所有过滤器插件,依赖于正在记录的容器类型以及该特定容器生成的日志消息。

这部分的配置没有捷径,因为每个容器都输出不同类型的日志。有很多尝试和错误涉及,但是有一些在线工具可参考, 比如:Grok Debugger。

导出部分将指定 Logstash 输出,例子中是 Elasticsearch 容器。

以下是通过 syslog 发送的 Docker 日志的基本 Logstash 配置示例。注意一系列过滤器的使用( grok , date , mutate 和 if 条件):

input {
 syslog {
      port => 5000
      type => "docker"
      }
}

filter {
      grok {
            match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:service}|-) +(?:%{NOTSPACE:containerName}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" }
      }
      syslog_pri { }
      date {
            match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
      }
      mutate {
            remove_field => [ "message", "priority", "ts", "severity", "facility", "facility_label", "severity_label", "syslog5424_pri", "proc", "syslog_severity_code", "syslog_facility_code", "syslog_facility", "syslog_severity", "syslog_hostname", "syslog_message", "syslog_timestamp", "ver" ]
      }
      mutate {
            remove_tag => [ "_grokparsefailure_sysloginput" ]
      }
      mutate {
            gsub => [
                  "service", "[0123456789-]", ""
            ]
      }
      if [msg] =~ "^ *{" {
            json {
                  source => "msg"
            }
            if "_jsonparsefailure" in [tags] {
                  drop {}
            }
            mutate {
                  remove_field => [ "msg" ]
            }
      }
}

output {
 elasticsearch {
      hosts => "elasticsearch:9200"
      }
}

重新启动 Logstash 容器以应用新的配置。检查 Elasticsearch 索引,确保日志流能正常工作:

curl "localhost:9200/_cat/indices?v"

具有 Logstash 模式的索引:

health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size

yellow open   logstash-2017.03.05 kgJ0P6jmQjOLNTSmnxsZWQ   5   1          3            0     10.1kb         10.1kb

yellow open   .kibana             09NHQ-TnQQmRBnVE2Y93Kw   1   1          1            0      3.2kb          3.2kb

打开 Kibana 的页面

Kibana 已经创建了"logstash- *" 索引是标识,按下“创建”按钮,可在 Kibana 中看到日志。

结语

Docker 日志记录没有完美的方案,无论选择什么解决方案,使用日志记录驱动程序, Filebeat 还是 SaaS 监控平台,每个方案都有优缺点。

值得一提的是, Docker 日志很有用,但它们只代表由 Docker 主机生成的数据的一个维度,检索容器统计信息和守护程序事件等还需要额外的日志记录层。

综上所述, Logz.io 日志收集器提供了一个全面的日志解决方案,将三个数据流一起拉到 ELK 中。如需统计数据,建议尝试一下 Dockerbeat.

本系列的下一部分将重点介绍如何在 Kibana 中分析和可视化 Docker 日志。

Docker 生日快乐!

Daniel Berman 是 Logz.io 产品经理。擅长日志分析、大数据、云计算,热爱家庭,喜欢跑步,Liverpool FC 和写颠覆性的技术内容。

原文链接: https://logz.io/blog/docker-l...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26851.html

相关文章

  • 使用ELK处理Docker日志(二)

    摘要:环境要求由,和容器组成使用日志收集器将日志发送到。若使用自己的部署,分析和可视化日志的概念保持不变。日志可视化以索引数据为基础创建丰富的可视化和仪表板的能力而闻名,事实上,得到这些数据并不容易。 昨天小数分享的使用ELK处理Docker日志(一)很受欢迎,今天迫不及待的带来第二篇,侧重于分析和可视化,期待给您带来帮助:) 嘘,听说数人云工程师们在奥斯汀DockerCON2017买了D...

    LiveVideoStack 评论0 收藏0
  • 使用Docker快速部署ELK分析Nginx日志实践

    摘要:数据导入与校验容器运行之后,笔者需要验证是否启动成功,可以通过浏览器访问和的页面是否成功来判断。的整体操作流程比较简单,首先是收集各种日志并进行过滤,然后将过滤后的内容发送到服务中,最后用户通过的页面查看中的日志数据作者汤青松微信日期 一、背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前听说有ELK...

    el09xccxy 评论0 收藏0
  • 使用Docker快速部署ELK分析Nginx日志实践

    摘要:数据导入与校验容器运行之后,笔者需要验证是否启动成功,可以通过浏览器访问和的页面是否成功来判断。的整体操作流程比较简单,首先是收集各种日志并进行过滤,然后将过滤后的内容发送到服务中,最后用户通过的页面查看中的日志数据作者汤青松微信日期 一、背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前听说有ELK...

    chenatu 评论0 收藏0
  • 使用Docker快速部署ELK分析Nginx日志实践

    摘要:数据导入与校验容器运行之后,笔者需要验证是否启动成功,可以通过浏览器访问和的页面是否成功来判断。的整体操作流程比较简单,首先是收集各种日志并进行过滤,然后将过滤后的内容发送到服务中,最后用户通过的页面查看中的日志数据作者汤青松微信日期 一、背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前听说有ELK...

    xumenger 评论0 收藏0
  • 如何在 Rancher 中统管理容器日志

    摘要:在中默认开启端口用于侦听发送过来的日志报文。至此,在中如何部署一套完整系统已经介绍完了,下面我将介绍如何将容器日志发送到中。下面我将介绍如何收集容器日志。目前日志显的杂乱无序。,现在我们再去查看发现我们的容器日志已经展示在这里了。 相信大家对于容器和 docker 这个概念并不陌生,很高兴的是 docker 为我们提供了多种log-driver。 showImg(https://se...

    whinc 评论0 收藏0

发表评论

0条评论

singerye

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<