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

Posted 数据分析与开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Logstash 实践: 分布式系统的日志监控相关的知识,希望对你有一定的参考价值。


来源:赵杰

链接:http://www.cnblogs.com/yiwenshengmei/p/4956033.html


1. 前言


服务端日志你有多重视?


  1. 我们没有日志

  2. 有日志,但基本不去控制需要输出的内容

  3. 经常微调日志,只输出我们想看和有用的

  4. 经常监控日志,一方面帮助日志微调,一方面及早发现程序的问题


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


日志怎么看?


  1. 都说了,我们没有日志

  2. 线上日志逐个tail+grep

  3. 编写脚本,下载某个时间范围内的全部日志到本地再搜索


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


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



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


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


实现这种效果的原理是后台跑着一个程序,这个程序负责汇总所有日志到一个本地文件中。只要执行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概念简单,通过组合可以满足多种需求。


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