使用ELK Stack的集中式系统和Docker日志记录

使用Docker时,无需将日志存储在文件中。 我们应该将信息输出到stdout / stderr,其余的将由Docker自行处理。 当我们需要检查日志时,我们要做的就是运行docker logs [CONTAINER_NAME]

随着Docker和微服务的日益普及,已部署容器的数量正在Swift增加。 Swift分别监视每个容器的日志成为噩梦。 单独监视几个甚至十个容器并不难。 当该数字开始增加到几十或几百时,单个日志记录充其量是不切实际的。 如果我们添加分布式服务,情况将变得更糟。 不仅我们有许多容器,而且它们分布在许多服务器上。

解决方案是使用某种集中式日志记录。 我们最喜欢的组合是ELK堆栈ElasticSearchLogStashKibana )。 但是,使用Docker进行集中式日志记录并不是一件容易的事(直到1.6版发布)。 我们有几个解决方案,但似乎都不够好。

我们可以将带有日志的容器目录作为卷公开。 从那里开始,我们可以告诉LogStash监视该目录,并将日志条目发送到ElasticSearch。 作为替代方案,我们可以使用LogStash转发器并节省一些服务器资源。 但是,真正的问题是应该不需要将日志存储在文件中。 使用Docker时,我们应该只将日志输出到stdout,其余的应该由日志处理。 此外,公开卷是我最不喜欢使用Docker的事情之一。 没有任何公开的卷,容器就更容易与不同的服务器一起推理和移动。 当将一组服务器视为数据中心并且使用编排工具(如Docker SwarmKubernetes)部署容器时,尤其如此。

还有其他选择,但它们都是骇客,难以设置或资源匮乏的解决方案。

Docker日志记录驱动程序

在1.6版中,Docker引入了日志记录驱动程序功能。 尽管它几乎没有引起人们的注意,但它是一项非常出色的功能,并且在创建用于在Docker环境中进行日志记录的综合方法方面迈出了一大步。

除了允许我们使用docker logs命令查看日志的默认json文件驱动程序之外,我们现在还可以选择使用syslog作为替代。 如果设置,它将容器输出(stdout和stderr)路由到syslog 。 作为第三种选择,也可以完全禁止将容器输出写入文件。 这样做可能会节省高清的使用,但在大多数情况下,几乎没有人需要这样做。

在本文中,我们将集中讨论syslog和将所有日志集中到一个ELK实例的方法。

Docker集中式日志记录

我们将建立ELK栈,使用泊坞窗系统日志记录驱动程序 ,最后,将所有的日志记录到中心位置,rsyslog现在syslogrsyslog都预装在几乎所有Linux发行版中。

我们将首先执行手动步骤。 在文章的结尾,将说明如何使用Ansible自动设置所有内容。 如果您不耐烦,请跳到最后。

流浪汉

本文中的示例基于Ubuntu,并假设您已启动并运行Docker。 如果是这种情况,请跳过本章。 对于那些无法轻松访问Ubuntu的用户,我们准备了具有所需所有功能的Vagrant VM。 如果还没有安装,请安装VirtualBoxVagrant 。 一切设置完成后,运行以下命令:

git clone https://github.com/vfarcic/docker-logging-elk.git
cd docker-logging-elk
vagrant up monitoring
vagrant ssh monitoring

执行完这些命令后,您应该位于已安装Docker的Ubuntu Shell中。 现在我们准备设置ELK

弹性搜索

我们将所有日志存储在ElasticSearch数据库中。 由于它使用JSON格式存储数据,因此可以轻松发送任何类型的日志结构。 更重要的是,ElasticSearch针对实时搜索和分析进行了优化,使我们能够轻松浏览日志。

让我们运行暴露端口9200的官方ElasticSearch容器。 我们将使用volume将数据库数据持久化到/ data / elasticsearch目录。

sudo mkdir -p /data/elasticsearch
sudo docker run -d --name elasticsearch 
    -p 9200:9200 
    -v /data/elasticsearch:/usr/share/elasticsearch/data 
    elasticsearch

LogStash

LogStash是集中任何类型数据处理的理想解决方案。 它的插件使我们有很大的自由来处理任何输入,过滤数据并产生一个或多个输出。 在这种情况下,输入将为syslog 。 我们将过滤和变异Docker条目,以便我们可以将它们与syslog的其余部分区分开。 最后,我们将结果输出到我们已经设置的ElasticSearch中。

容器将使用官方的LogStash映像。 它将公开端口25826,共享主机卷/ data / logstash / config,它将提供所需的配置,最后将链接到ElasticSearch。

sudo docker run -d --name logstash 
    --expose 25826 
    -p 25826:25826 
    -p 25826:25826/udp 
    -v $PWD/conf:/conf 
    --link elasticsearch:db 
    logstash logstash -f /conf/syslog.conf

该容器使用-f标志运行,该标志允许我们指定要使用的配置。 我们正在使用的( syslog.conf )如下所示。

input {
  syslog {
    type => syslog
    port => 25826
  }
}

filter {
  if "docker/" in [program] {
    mutate {
      add_field => {
        "container_id" => "%{program}"
      }
    }
    mutate {
      gsub => [
        "container_id", "docker/", ""
      ]
    }
    mutate {
      update => [
        "program", "docker"
      ]
    }
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    host => db
  }
}

那些不习惯LogStash配置格式的文件可能会有些混乱,因此让我们逐步介绍它。 除其他外,每个配置都可以具有输入,过滤器和输出部分。

输入部分,我们告诉LogStash监听端口25826上的syslog事件。

过滤器部分稍微复杂一点,简而言之,它将docker作为程序查找(Docker日志记录驱动程序将自己注册为docker / [CONTAINER_ID]格式的程序)。 找到此类程序后,它将其值更改为新字段container_id,并将程序更新为docker

最后,我们将结果输出到stdout (使用rubydebug编解码器),更重要的是,输出到ElasticSearch

随着ElasticSearch的启动和运行以及LogStash监听syslog事件,我们已经准备好设置rsyslog

系统日志

rsyslog是用于处理日志的非常快速的系统。 我们将使用它来将syslog条目传递到LogStash 。 它已经预装在Ubuntu中,因此我们要做的就是将其配置为与LogStash一起使用。

sudo cp conf/10-logstash.conf /etc/rsyslog.d/.
sudo service rsyslog restart

我们复制了一个新的rsyslog配置并重新启动了该服务。 配置文件非常简单。

*.* @@10.100.199.202:25826

它告诉rsyslog将所有系统日志条目( *.* )发送到远程( @@ )位置( 10.100.199.202:25826 )。 在这种情况下,10.100.199.202是我们创建的Vagrant VM的IP。 如果您使用自己的服务器,请将其更改为正确的IP。 另外,由于该示例中仅使用一台服务器,因此IP也不是远程位置。 在“现实”场景中,您将在每台服务器上设置rsyslog以指向部署ELK的中央位置。

现在我们正在捕获所有syslog事件并将其发送到ElasticSearch ,现在该可视化我们的数据了。

基巴纳

Kibana是一个分析和可视化平台,旨在处理实时数据。 它与ElasticSearch无缝集成。

与ElasticSearch和LogStash不同,没有官方的Kibana映像,因此我们为您创建了一个。 可以在Docker Hub的vfarcic / kibana下找到它。

我们将公开端口5601并将其与ElasticSearch容器链接。

sudo docker run -d --name kibana 
    -p 5601:5601 
    --link elasticsearch:db 
    vfarcic/kibana

Kibana使我们能够轻松设置仪表板,以满足项目或组织的特定需求。 如果您是第一次使用,最好通过创建一个示例仪表板来展示来自syslog的系统日志和Docker日志的用法。

以下命令带有导入示例Kibana设置。 它将使用带有ElasticDump工具的容器,该工具为ElasticSearch提供导入和导出工具。 该容器是定制的,可以在Docker Hub的vfarcic / elastic-dump找到

sudo docker run --rm 
    -v $PWD/conf:/data 
    vfarcic/elastic-dump --input=/data/es-kibana.json 
    --output=http://10.100.199.202:9200/.kibana --type=data

运行此容器后,文件es-kibana.json中的 Kibana配置将导入到运行在10.100.199.202:9200的ElasticSearch数据库中。

现在我们来看看刚刚设置的Kibana仪表板。 在您喜欢的浏览器中打开http:// localhost:5601

初始屏幕显示所有未过滤的日志。 您可以从屏幕的左侧添加列,创建新搜索,等等。在我们导入的Kibana设置中,有一个名为error的保存搜索。 它过滤日志,以便仅显示包含单词错误的日志。 我们可以用许多其他方式来做到这一点,但是这似乎是最简单,最直接的。 通过单击屏幕右上角的“ 加载已保存的搜索”图标将其打开。 目前,它显示的错误很少或没有,因此让我们生成一些假错误。

logger -s -p 1 "This is fake error..."
logger -s -p 1 "This is another fake error..."
logger -s -p 1 "This is one more fake error..."

刷新Kibana屏幕,您应该看到这三个错误消息。

除了以列表格式查看日志外,我们还可以创建自己的仪表板。 例如,单击“ 仪表板”顶部菜单,然后单击“ 加载保存的仪表板”并选择错误 (我们先前导入的另一个错误 )。

基巴纳

使用syslog运行容器

直到这一刻,我们只看到系统日志,因此让我们运行一个新的Docker容器并将其设置为使用syslog日志驱动程序

sudo docker run -d --name bdd 
    -p 9000:9000 
    --log-driver syslog 
    vfarcic/bdd

如果我们回到Kibana,点击查找和打开保存的搜索称为泊坞窗 ,应该有,至少三个条目。

而已。 现在,我们可以根据需要将其扩展到尽可能多的容器和服务器。 所有要做的就是在每个服务器上设置rsyslog并使用--log-driver syslog运行容器。 请记住,标准docker logs命令将不再起作用。 那是预期的行为。 日志应放在一个地方,易于查找,过滤,可视化等。

我们已经完成了此虚拟机,所以让我们退出并停止它。

exit
vagrant halt

Ansible

我们在本文开头克隆的存储库包含另外两个Vagrant虚拟机。 其中一个( elk )包含ElasticSearch,LogStash和Kibana。 另一个( docker-node )是一台单独的机器,其中一个docker容器已启动并正在运行。 虽然手动设置是一种很好的学习方法,但是业务流程和部署应该是自动化的。 一种方法是使用Ansible,因此让我们完全自动化地重复相同的过程。

vagrant up elk
vagrant up docker-node

http:// localhost:5601中打开Kibana。 它与我们手动进行的设置完全相同,但通过Ansible自动完成。

完整的源代码可以在vfarcic / docker-logging-elk GitHub存储库中找到。 随意进行和修改Ansible设置,使其适应您的需求。

如果您在阅读本文时遇到困难或有任何其他问题,请发表评论或通过电子邮件与我联系(信息位于“ 关于”部分)。

翻译自: https://www.javacodegeeks.com/2015/05/centralized-system-and-docker-logging-with-elk-stack.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值