logstash实践:分布式系统的日志监控

author author     2022-09-16     291

关键词:

转自:http://www.jianshu.com/p/6575041b597d

1. 前言

服务端日志你有多重视?

  1. 我们没有日志
  2. 有日志,但基本不去控制需要输出的内容
  3. 经常微调日志,只输出我们想看和有用的
  4. 经常监控日志,一方面帮助日志微调,一方面及早发现程序的问题

只做到第1点的,你可以洗洗去睡了。很多公司都有做到第2点和第3点,这些公司的服务端程序基本已经跑了很长时间了,已比较稳定,确实无需花太多时间去关注。如果一个新产品,在上线初期,我觉得就有必要做到第4点。

日志怎么看?

  1. 都说了,我们没有日志
  2. 线上日志逐个tail+grep
  3. 编写脚本,下载某个时间范围内的全部日志到本地再搜索

tail+grep或者把日志下载下来再搜索,可以应付不多的主机和不多的应用部署场景。但对于多机多应用部署就不合适了。这里的多机多应用指的是同一种应用被部署到几台服务器上,每台服务器上又部署着不同的多个应用。可以想象,这种场景下,为了监控或者搜索某段日志,需要登陆多台服务器,执行多个tail -Fgrep命令。一方面这很被动。另一方面,效率非常低,数次操作下来,你心情也会变糟。

这篇文章讲的就是如何解决分布式系统的日志管理问题。先给大家看看最终的效果:

技术分享
日志实时监控效果图

单个屏幕上所有服务器的日志实时滚动着显示。每条日志开头还标明日志的来源(下图)。

技术分享
每行日志标有来源信息

实现这种效果的原理是后台跑着一个程序,这个程序负责汇总所有日志到一个本地文件中。只要执行tail -f这个文件就可以做到监控日志了。因为所有日志都汇总在一个文件里了,所以日志搜索的时候只要搜索这一个文件就可以了。

本文介绍的,能够汇总日志文件的工具名字叫Logstash。使用JRuby编写,开源,主流,免费,使用简单。

2. Logstash部署架构

Logstash的理念很简单,它只做3件事情:

  1. Collect:数据输入
  2. Enrich:数据加工,如过滤,改写等
  3. Transport:数据输出

别看它只做3件事,但通过组合输入和输出,可以变幻出多种架构实现多种需求。这里只抛出用以解决日志汇总需求的部署架构图:

技术分享
Logstash部署架构

解释术语:

  • Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
  • Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
  • Broker:日志Hub,用来连接多个Shipper和多个Indexer。

无论是Shipper还是Indexer,Logstash始终只做前面提到的3件事:

  • Shipper从日志文件读取最新的行文本,经过处理(这里我们会改写部分元数据),输出到Redis,
  • Indexer从Redis读取文本,经过处理(这里我们会format文本),输出到文件。

一个Logstash进程可以有多个输入源,所以一个Logstash进程可以应付一台服务器上的所有日志。Redis是Logstash官方推荐的Broker角色“人选”,支持订阅发布和队列两种数据传输模式,推荐使用。输入输出支持过滤,改写。Logstash支持多种输出源,可以配置多个输出实现数据的多份复制,也可以输出到Email,File,Tcp,传递给其他程序作为输入,或者安装插件实现和其他系统的对接,如搜索引擎Elasticsearch。

总结:Logstash概念简单,通过组合可以满足多种需求。

3. Logstash的安装,搭建和配置

3.1. 安装Java

下载JDK压缩包。
一般解压到/user/local/下,形成/usr/local/jdk1.7.0_79/bin这种目录结构。
配置JAVA_HOME环境变量:echo ‘export JAVA_HOME=/usr/local/jdk1.7.0_79‘ >> ~/.bashrc

3.2 安装Logstash

官网下载Logstash的压缩包。
一般也解压到/usr/local/下,形成/usr/local/logstash-1.4.3/bin这种目录结构。

Logstash的运行方式为主程序+配置文件。Collect,Enrich和Transport的行为在配置文件中定义。配置文件的格式有点像json,又有点像php。

3.3. 编写Shipper角色的配置文件:shipper.conf
input {
    file {
        path => [
            # 这里填写需要监控的文件
            "/data/log/php/php_fetal.log",
            "/data/log/service1/access.log"
        ]
    }
}

如上,input描述的就是数据如何输入。这里填写你需要收集的本机日志文件路径。

output {
    # 输出到控制台
    # stdout { }

    # 输出到redis
    redis {
        host => "10.140.45.190"   # redis主机地址
        port => 6379              # redis端口号
        db => 8                   # redis数据库编号
        data_type => "channel"    # 使用发布/订阅模式
        key => "logstash_list_0"  # 发布通道名称
    }
}

如上,output描述的就是数据如何输出。这里描述的是输出到Redis

data_type的可选值有channellist两种。用过Redis的人知道,channel是Redis的发布/订阅通信模式,而list是Redis的队列数据结构。两者都可以用来实现系统间有序的消息异步通信。channel相比list的好处是,解除了发布者和订阅者之间的耦合。举个例子,一个Indexer在持续读取Redis中的记录,现在想加入第二个Indexer,如果使用list,就会出现上一条记录被第一个Indexer取走,而下一条记录被第二个Indexer取走的情况,两个Indexer之间产生了竞争,导致任何一方都没有读到完整的日志。channel就可以避免这种情况。这里的Shipper和下面将要提到的Indexer配置文件中都使用了channel

filter {
    mutate {
        # 替换元数据host的值
        replace => ["host", "10.140.46.134 B[1]"]
    }
}

如上,filter描述的是如何过滤数据。mutate是一个自带的过滤插件,它支持replace操作,可以改写数据。这里改写了元数据中的host字段,替换成了我们自己定义的文本。

Logstash传递的每条数据都带有元数据,如@version,@timestamp,host等等。有些可以修改,有些不允许修改。host记录的是当前的主机信息。Logstash可能不会去获取主机的信息或者获取的不准,这里建议替换成自己定义的主机标示,以保证最终的日志输出可以有完美的格式。

3.4 编写Indexer角色的配置文件:indexer.conf
input {
    redis { 
        host      => "10.140.45.190"    # redis主机地址
        port      => 6379               # redis端口号
        db        => 8                  # redis数据库编号
        data_type => "channel"          # 使用发布/订阅模式
        key       => "logstash_list_0"  # 发布通道名称
    } 
}

如上,input部分设置为从redis接收数据

output { 
    file { 
        path           => "/data/log/logstash/all.log" # 指定写入文件路径
        message_format => "%{host} %{message}"         # 指定写入格式
        flush_interval => 0                            # 指定刷新间隔,0代表实时写入
    }
}

如上,output部分设置为写入本地文件

官方文档里flush_interval为缓冲时间(单位秒)。我实践下来不是秒而是数量,Logstash会等待缓冲区写满一定数量后才输出。这对线上调试是不能接受的,建议上线初期设为0。程序稳定后,随着日志量的增大,可以增大flush_interval的值以提高文件写入性能。

Indexer的配置文件中,我明确指定了message_format的格式,其中%{host}对应的就是之前手动设置的host元数据。

3.5. 启动Logstash
# 先在Indexer主机上启动
nohup /usr/local/logstash-1.4.3/bin/logstash agent -f indexer.conf &>/dev/null &
# 再在Shipper主机上启动
nohup /usr/local/logstash-1.4.3/bin/logstash agent -f shipper.conf &>/dev/null &
# 最后在Indexer上观察日志
tail -f /data/log/logstash/all.log

我们来测试一下,切到Shipper主机上,模拟日志产生:

echo "Hello World" >> /data/log/php/php_fetal.log

再切换到Indexer主机上,如果出现:10.140.46.134 B[1] Hello World,说明Logstash部署成功。

3.6. 日志着色脚本

使用awk配合echo,可以匹配你想要高亮的文本并改变他们的前景色和背景色。就像效果图里的那样。这里附上我写的脚本,把脚本中的关键信息替换成你想要匹配的文本即可:

tail -f /data/log/logstash/all.log | awk ‘{ 
     if (match($0, /.*(PHP Deprecated|PHP Notice|PHP Fatal error|PHP Warning|ERROR|WARN).*/)) { print "33[41;37;1m"$0"33[0m" } 
else if (match($0, /.*关键信息1.*/)) { print "33[32;1m"$0"33[0m" } 
else if (match($0, /.*关键信息2.*/)) { print "33[36;1m"$0"33[0m" }
else { print $0 } }‘

So easy,妈妈再也不用担心我的日志。。。

4. 还有什么

有些公司需要挖掘日志的价值,那仅仅收集和实时显示是不够的,需要把逼格上升到日志分析技术层面。

一个完整的日志分析技术栈需要实时收集,实时索引和展示三部分组成,Logstash只是这其中的第一个环节。Logstash所属的Elastic公司,已经开发了完整的日志分析技术栈,它们是Elasticsearch,Logstash,和Kibana,简称ELK。Elasticsearch是搜索引擎,而Kibana是Web展示界面。

技术分享
日志分析技术栈

如果你搭建了完整的技术栈,你的老板就可以在图形化界面上按不同的维度去搜索日志了。

技术分享
Kibana界面

还可以做一些高大上的统计和计算。

技术分享
Kibana界面

当然,我认为90%的公司是没有必要这么做的,能做到在控制台里监控和搜索就能满足需要了。但我们也可以看看剩下的那10%的公司是怎么做的,比如:新浪是如何分析处理32亿条实时日志的?


参考文献:



作者:怡文圣美
链接:http://www.jianshu.com/p/6575041b597d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。














1.elk系统落地实践

...问题。Elasticsearch代表ELK中的E,通常简称为ES。它是一个分布式RESTful风格的搜索和数据分析引擎,提供非常多的功能包括存储,搜索以及分析数据。具体的介绍可以查看官网:Elasticsearch(https://www.elastic.co/guide/en/elasticsearch/referenc... 查看详情

微服务-分布式日志系统logstash部署

 参考资料:1、Logstash中文官网2、 阿里云Elasticsearch> 最佳实践 > logstash部署3、 logstash、elasticsearch、kibana搭建日志平台(CSDN) 安装步骤如下:  查看详情

windows10下elk环境快速搭建实践

...施纠正错误,因此日志的重要性不言而喻。但是,在系统分布式后,日志通常被分散的储存不同的设备上。比如当系统为数十上百台服务器,必须依次登录每台机器的传统方法查阅日志,这样很繁琐和效率低下。因此日志的集中... 查看详情

监控工作原理

...收集的代理(Agent);Elasticsearch是工作于核心层的开源的分布式搜索引擎,提供日志数据检索、分析、存储;Kibana是工作于展现层的开源免费 查看详情

elk日志监控平台

一elk开源日志分析平台介绍1介绍elasticsearch是一个开源分布式搜索引擎,它的特点是:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动负载等特性logstash:是一个完全开源的工具,他... 查看详情

利用开源架构elk构建分布式日志系统

...用成熟的经典架构ELK(即Elasticsearch,Logstash和Kibana)构建分布式日志监控系统,很多公司采用该架构构建分布式日志系统,包括新浪微博,freewheel,畅捷通等。背景日志,对每个系统来说,都是很重要,又很容易被忽视的部分。... 查看详情

elk初步实践

...合完成日志的搜集。组件一览名称版本说明Elasticsearch2.3分布式搜索引擎,存储和搜索日志Logstash2.3分析和搜集日志的工具,实践中主要使用它的分析功能Kibana4.5为Elasticsearch的查询、分析和统计提 查看详情

logstash实践(代码片段)

 Logstash简介一个开源的数据收集引擎,具有实时数据传输能力,可以统一过滤来自不同源的数据,并按照开发者制定的规范输出到目的地。顾名思义,Logstash收集数据对象就是日志文件,由于日志文件来源众多(如,系统日... 查看详情

3.20go微服务实战(微服务实战)---日志和监控

第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常    查看详情

3.20go微服务实战(微服务实战)---日志和监控

第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常    查看详情

elk日志分析系统

...Logstash和Kiabana三个开源工具组成:1:Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。2:Logstash是一个完全开源的工具... 查看详情

filebeat+kafka+logstash+elasticsearch+kibana构建日志分析系统(代码片段)

...析。本文介绍具体的实现方法。二、背景信息Kafka是一种分布式、高吞吐、可扩展的消息队列服务,广泛用于日志收集、监控数据聚合、流式数据处理、在线和离线分析等大数据领域,已成为大数据生态中不可或缺的部分... 查看详情

亿级elk日志平台构建实践(代码片段)

...格式等操作,然后存储以供后续使用。Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch基于Lucene开发,现在使用最广的开源... 查看详情

logstash笔记

(一)含义:    logstash是一种分布式日志收集框架,开发语言是JRuby,当然是为了与Java平台对接,不过与Ruby语法兼容良好,非常简洁强大,经常与ElasticSearch,Kibana配置,组成著名的ELK技术栈,非常适合用来做日... 查看详情

elk分布式日志系统架构(代码片段)

filebeat=>kafka/redis=>logstash=>ElasticSearch=>kibana<=>nginx/haproxy<=日志查询用户Filebeat收集日志,发送到中间件Kafka/Redis消息列队暂存数据,供logstash拉取Logstash拉取并处理 查看详情

elk日志分析系统(实例!!!)(代码片段)

...的展示(Kibana)Elasticsearch介绍Elasticsearch的概述提供了一个分布式多用户能力的全文搜索引擎Elasticsearch的概念接近实时集群节点索引:索引(库)-->类型(表)-->文档(记录)分片和副本Logstash介绍一款强大的数据处理工具,可以实现... 查看详情

企业实践|分布式系统可观测性之应用业务指标监控

本文主要讲述如何建立应用业务指标Metrics监控和如何实现精准告警。Metrics可以翻译为度量或者指标,指的是对于一些关键信息以可聚合的、数值的形式做定期统计,并绘制出各种趋势图表。透过它,我们可以观察系统的状态与... 查看详情

微博广告hubble系统:秒级大规模分布式智能监控平台架构实践

微博广告Hubble系统:秒级大规模分布式智能监控平台架构实践关键词:微博广告Hubble监控平台D+大数据机器学习LSTMTensorflow业务背景Hubble(哈勃,其含义是数据如浩瀚宇宙之大,Hubble如太空望远镜,能窥见璀璨的星辰,发现数据... 查看详情