用ELK打造可视化集中式日志

Elk是Elastic search, Logstash和Kibana三者的简称。

Elastic search顾名思义是致力于搜索,它是一个弹性搜索的技术平台,与其相似的有Solr,二者的对比可参考下面这篇文章:
Elastic search与Solr选型

总结一下就是,如果你不喜欢夜店咖还是喜欢忠实可靠的老婆,那选Elastic search准没错,何况他还有那么一点美。目前运用ES的案例也不少了,比如it屌丝们都爱的Git hub以及我D痛恨的Wiki。

Logstash,也可以顾名思义一下,stash的意思是藏匿处,所以……其实并不完全准确,Logstash是用来做日志采集,藏匿几乎就不由他管了,藏匿由谁管呢,聪明的看官肯定能猜到是ES了。但是这也不完全准确,在ELK的运维环境中肯定是ES没跑了,不过Logstash支持各种输出源,包括redis,s3,mongodb以及kafka,甚至对于情怀粉(不嘛,人家就喜欢刺刀,不要枪炮,拼刀才爷们)吧,还贴心的支持http的远程写文件方案。总之我们能想到的,作者也想到了,我们没能想到的,作者也想到了,如果有作者没能写到的,那也没关系,你可以自己写插件。什么?你写不出来?写不出来就不要瞎bb,找个现成能用的。相对应的,ES也支持各种输入源,从基本的stdin到file到redis到……

Kibana,呃,羔羊肉饼。估计作者是个洋鬼子北京情怀蜜吧,代码写多了,看着掉了一地的头发,想着要是能吃份东来顺的铜锅涮羊肉多好,然后取了这鬼名字吧。Kibana主要是用于ES分析和查询。Elk里本来完全可以不用带他的,用用ES的head和bigdesk插件也蛮好,不过Kibana的管理和查询用起来确实方便很多,人嘛,有枪炮用何必非要用刺刀,默默想到楼主的前东家。


那个奶妈形态的德鲁伊就是Logstash,agent只是Logstash承担的一个角色,与此对应的是indexer。agent会分别将各自获取的日志作为输入输出到一个消息代理(例如redis或者kafka),indexer会将消息代理作为输入再输出到ES上,由ES做indexing。其实Logstash在整个过程中只负责输入输出,对Logstash而言并没有agent和index之分。如果日志量小的话完全不需要设置indexer,直接将ES作为agent的输出源。

Elastic search

环境准备:
Jdk7及以上,Logstash2.1明确只支持Jdk7。
Elastic search, Kibana, Logstash下载地址
ES不能以root权限启动。

楼主的环境;
10.0.250.90 9200 9300
10.0.250.90 9201 9301
10.0.250.90 9200 9300
第一个端口是对外提供http服务的接口,第二个端口是集群交换协议的端口。

cd /opt/elasticsearch-2.1.0/config
vim elasticsearch.yml

以10.0.250.90 9200 9300为例。
修改集群名称,ES默认通过广播发现节点,所有在广播里声明为同一个集群名称的节点都会被自动加入集群中。

cluster.name: es

设置节点名称

node.name: es-node-2

````
此外可以通过node.master设置节点是否可以被推举为leader以及node.data设置节点是否保存索引数据。

节点的定制化属性信息,我把三个节点设成r1-r3

<div class="se-preview-section-delimiter"></div>

node.rack: r2

数据存储目录

<div class="se-preview-section-delimiter"></div>

path.data: /usr/local/data/

日志目录,默认生成的日志文件是${cluster.name}_xxx,可以通过logging.yml修改

<div class="se-preview-section-delimiter"></div>

path.logs: /var/log/es/

启动时是否就锁住内存,es是基于java,遵循java的内存回收,java内存分配一般会设定一个最小值(-Xms)和一个最大值(-Xmx),这样虽然能在空闲时节约内存,但是却会带来频繁的gc。所以es建议在启动时就锁定内存,并且es建议将主机一半可用内存分配给它。

<div class="se-preview-section-delimiter"></div>

bootstrap.mlockall: true

绑定网络地址,默认是127.0.0.1。可以通过transport.tcp.port设置项设置几圈交换协议的端口。

<div class="se-preview-section-delimiter"></div>

network.host: 10.0.250.91
http.port: 9200

1. 设置初始化时的发现列表,新节点会通过单播的方式发现列表里的节点。
2. 设置有master资格的节点最小个数,低于这个个数可能会发生脑裂。es建议的个数是所有节点数/2+1。
所谓脑裂是指集群中有多个active的master节点,这样就导致多个节点接管集群服务。举个例子:
假设A,B,C三个节点都有master资格,A节点为active,其他未standby,但是A节点出了故障,这时B,C就要进行投票选出新的leader,此时的结果就可能会是B和C都互有两票,量个节点都分别active。
这里只是描述脑裂成因,和ES的脑裂成因并不完全一样,ES的投票机制应该是类似于redis先到先得的那种。不过配置上最好遵从es的建议。

<div class="se-preview-section-delimiter"></div>

discovery.zen.ping.unicast.hosts: [“10.0.250.90:9300”, “10.0.250.91:9300”]
discovery.zen.minimum_master_nodes: 2

配置完以后,启动elastic

<div class="se-preview-section-delimiter"></div>

bin/elasticsearch
curl http://10.0.250.91:9200
curl http://10.0.250.91:9200/_nodes

通过curl命令查看下节点状态以及整个集群的节点状态。

推荐安装head插件,可以查看集群状态

<div class="se-preview-section-delimiter"></div>

bin/plugin install mobz/elasticsearch-head

bigdesk插件在当前版本上无法使用,因为ES通过Rest接口返回的json数据不标准,jquery会出parse错误。

通过浏览器访问http://10.0.250.91:9200/_plugin/head
![节点状态](http://img.blog.csdn.net/20151226175252443)

<div class="se-preview-section-delimiter"></div>

## Kibana ##
Kibana的安装也很简单,下载最新版本并安装。
我安装在251主机上。

<div class="se-preview-section-delimiter"></div>

vim config/kibana.yml

设置Kibana端口

<div class="se-preview-section-delimiter"></div>

server.port: 5601


设置提供rest查询服务的ES节点,设置了后Kibana就会通过这个节点查询信息了。

<div class="se-preview-section-delimiter"></div>

elasticsearch.url: “http://10.0.250.90:9200

设置Kibana自用索引,主要用来存储Kibana保存的一些内容,例如查询信息,报表等

<div class="se-preview-section-delimiter"></div>

kibana.index: “.eslogs”

启动Kibana

<div class="se-preview-section-delimiter"></div>

bin/kibana

访问Kibana,第一次使用时会让你建logstash的索引规则,默认为logstash-*,*代表日期,每天会生成一个新的索引。

<div class="se-preview-section-delimiter"></div>

## Logstash ##
Logstash的安装非常简单,下载最新版本并安装,我用的是2.1.1.

<div class="se-preview-section-delimiter"></div>

bin/logstash -e ”

-e ''会默认以stdin作为输入,以stdout作为输出。
我在控制台输入11111,控制台就输出了格式化的输出。

<div class="se-preview-section-delimiter"></div>

11111
{
“message” => “11111”,
“@version” => “1”,
“@timestamp” => “2015-12-26T10:00:23.422Z”,
“type” => “stdin”,
“host” => “0.0.0.0”
}

接着,我们再测试一下以ES作为输出源,在ES根目录下:

<div class="se-preview-section-delimiter"></div>

mkdir config
touch logstash-indexer.conf
vim logstash-indexer.conf

修改logstash-indexer.conf定义输入源为stdin,输出为stdout以及ES.

<div class="se-preview-section-delimiter"></div>

input {
stdin{
type=> “stdin-input”
}
}
output {
stdout { codec=> rubydebug }
elasticsearch {
hosts=> [“10.0.250.90:9200”]
codec=> “json”
}
}

启动Logstash

<div class="se-preview-section-delimiter"></div>

bin/logstash -f config/logstash-indexer.conf -l /var/log/logstash/logstash.log
“`
输入“hello this a test message”然后回车

在Kibana那就能看到对应的日志信息

时间: 2025-01-01 17:36:31

用ELK打造可视化集中式日志的相关文章

集中式日志管理部署下的Log输出

集中式日志管理部署下的Log输出 Log是程序记录执行过程,辅助排查问题的必备良药.随着后台程序越来越复杂,集群规模越来越大,通常会引入集中式程序日志管理,比如使用splunk或者ELK统一管理日志.Log打的好,排错无烦恼,但是往往打不好.下面就聊聊怎么打Log,特别是在使用集中式日志管理架构时. 为什么Log输出变得越来越难 一句话描述Log查找的需求:根据查询条件,返回并且仅返回所关注的用例相关的所有上下文. 怎么变难的: 单线程同步:有时间戳和重要参数值就差不多了 多线程同步:你可能需要

Cloudflare物联网安全新品上线 用集中式控制替代IoT监管

本文讲的是Cloudflare物联网安全新品上线 用集中式控制替代IoT监管,物联网(IoT)安全危机迅速发展.新僵尸网络强征路由器和安全摄像头,黑客利用医疗设备入侵整个医院网络,智能玩具继续涌向我们的下一代.不过,互联网基础设施公司Cloudflare,在过去1年半里一直在研究IoT安全解决方案. Cloudflare主流产品从内容分发到DDoS防御都有囊括,4月27日,又一新服务上线,名为Orbit,作为IoT全新防御层.该服务具备让联网设备比以往更安全的潜力,但过程中也引起了一些问题. 物

腾讯电商吴宵光:集中式打法+多平台联动的连横合纵战术

蛇年伊始,电商领域风云再起. 2月17日,京东商城董事局主席兼CEO刘强东一封内部信件,披露公司已完成第四轮约7亿美元的融资:两天后,其竞争对手苏宁发布公告,将公司名称变为"苏宁云商集团股份有限公司",打造"云商"模式:3月初,苏宁云商董事长张近东接力在"两会"提案"加强电商征税,监管VIE",一石激起千层浪,淘宝网官方微博甚至公开回击:数日后,阿里巴巴集团对外公布,陆兆禧接替之前辞职的马云担任CEO. 喧嚣中,国内的前四大电

elk收集分析nginx access日志

elk收集分析nginx access日志 首先elk的搭建按照这篇文章使用elk+redis搭建nginx日志分析平台说的,使用redis的push和pop做队列,然后有个logstash_indexer来从队列中pop数据分析插入elasticsearch.这样做的好处是可扩展,logstash_agent只需要收集log进入队列即可,比较可能会有瓶颈的log分析使用logstash_indexer来做,而这个logstash_indexer又是可以水平扩展的,我可以在单独的机器上跑多个in

HDFS集中式的缓存管理原理与代码剖析

Hadoop 2.3.0已经发布了,其中最大的亮点就是集中式的缓存管理(HDFS centralized cache management).这个功能对于提升Hadoop系统和上层应用的执 行效率与实时性有很大帮助,本文从原理.架构和代码剖析三个角度来探讨这一 功能. 主要解决了哪些问题 用户可以根据自己的逻辑指定一些经常被使用的数据或者高优先级任务对应的 数据,让他们常驻内存而不被淘汰到磁盘.例如在Hive或Impala构建的数据仓库 应用中fact表会频繁地与其他表做JOIN,显然应该让fa

Java应用从集中式步入分布式

记得Martin大叔在<企业应用架构模式>中特别强调:"能够不分布式的应 用就不要分布式",这句话没什么问题,尤其对于做过分布式应用的人而言,就 更会有深刻的体会了,但这个世界偏偏就没有那么简单,大多数人都会碰到分布 式应用的场景,尤其是对于大型应用而言,从集中式步入分布式是不可避免的, 只是也许是小型分布式的,也许是大型分布式的:也许是有高性能要求的,也许 是没有的,在这篇blog中我们来看看java应用从集中式步入分布式后到底会带来 些什么挑战. blog按照应用从集中

SDN学习笔记:分布式与集中式控制层面

"水在人类文明发展历程中的作用非常重要.用来存储.处理和传播信息及知识的计算机的发展历程,与人类储存.使用和管理水的历程有很多相似之处.在原始部落以及游牧时期,人们的生活和生产局限在靠近水源的范围,需要水的时候,要去江河湖泊里取水回来,'江河湖泊'就像'主机'.到了个人计算机时代,如同人类的农耕时代,由于家家都有水井,人们的生活和生产获得了更多的自由和便利:'水井'很像个人计算机,自给自足,但是不能共享.大量闲置,严重浪费和低效.等我们到了城市,有了发达的自来水网络,'水'被集中起来处理.随时.

DataV,让拖拖拽拽就可以打造可视化应用

想必大家都或多或少看过2015年双11的直播大屏,又酷又炫!这个直播大屏背后实际上是由DataV数据可视化技术搭建而成,结合阿里云流计算StreamCompute,把所有业务当天实时的情况呈现在大屏幕上. 为什么推出DataV? 相比于传统图表与数据仪表盘,如今的数据可视化致力于用更生动.友好的形式,即时呈现隐藏在瞬息万变且庞杂数据背后的业务洞察.无论在零售.物流.电力.水利.环保,还是在交通领域,通过交互式实时数据可视化视屏墙帮助业务人员发现.诊断业务问题,开始成为大数据解决方案中不可或缺的一

使用iSCSI Target创建集中式安全存储(一)

使用iSCSI Target创建集中式安全存储(一) iSCSI 是一种块级别的协议,用于通过TCP/IP网络共享原始存储设备,可以用已经存在的IP和以太网如网卡.交换机.路由器等通过iSCSI协议共享和访问存储.iSCSI target是一种由远程iSCSI服务器(target)提供的远程硬盘. 在Linux中安装iSCSI Target 我们不需要占用很大的资源就可以为客户端提供稳定的连接和性能.iSCSI服务器称为"Target(目标器)",它提供服务器上的存储共享.iSCSI客