搭建elk

来源:互联网 发布:广告文案的100案例知乎 编辑:程序博客网 时间:2024/05/20 12:20

项目中部署了多节点,所以日志看起来很不方便,就动手搞一套elk收集日志,看了网上很多的攻略感觉并不是很难,但还是遇到了蛮多的坑。

一、基础配置
由于elk的组件都是基于java的,所以java环境肯定是必须的。新版本的elk对java版本也是有要求的,要求是1.8。服务器是用的开发的服务器,java什么的也都装了,本以为可以省事,没想到这里却是个坑。。。。

二、Logstash
1、下载Logstash包:
可以用wget

wget https://download.elastic.co/logstash/logstash/logstash-****.tar.gz

我们这边运维对服务器的控制很严,没法访问外网,所以只能下载下来再传上去
https://download.elastic.co

2、安装:
直接tar解压就可以了
这里写图片描述

3、配置文件:
要启动Logstash,首先需要自己在 /[path]/logstash-5.5.2/config 目录下创建个.conf的配置文件,名字可以自己取,我这里创建了logstash.conf文件
这里写图片描述
配置文件的内容也很简单

input {file {  path => "/var/log/messages"  start_position => "beginning"}}output {  elasticsearch { hosts => ["localhost:9200"] }}

顾名思义,input表示日志的来源,output表示输出,elasticsearch则是elk中另外一个组件,主要负责的是日志的搜索,下面有个比较全的参数解释

参数名称 类型 默认值 描述信息 add_field hash {} 用于向Event中添加字段 close_older number 3600 设置文件多久秒内没有更新就关掉对文件的监听 codec string “plain” 输入数据之后对数据进行解码 delimiter string “\n” 文件内容的行分隔符,默认按照行进行Event封装 discover_interval number 15 间隔多少秒查看一下path匹配对路径下是否有新文件产生 enable_metric boolean true exclude array 无 path匹配的文件中指定例外,如:path => “/var/log/“;exclude =>”.gz” id string 无 区分两个相同类型的插件,比如两个filter,在使用Monitor API监控是可以区分,建议设置上ID ignore_older number 无 忽略历史修改,如果设置3600秒,logstash只会发现一小时内被修改过的文件,一小时之前修改的文件的变化不会被读取,如果再次修改该文件,所有的变化都会被读取,默认被禁用 max_open_files number 无 logstash可以同时监控的文件个数(同时打开的file_handles个数),如果你需要处理多于这个数量多文件,可以使用“close_older”去关闭一些文件 path array 无 必须设置项,用于匹配被监控的文件,如“/var/log/.log”或者“/var/log//.log”,必须使用绝对路径 sincedb_path string 无 文件读取记录,必须指定一个文件而不是目录,文件中保存没个被监控的文件等当前inode和byteoffset,默认存放位置“$HOME/.sincedb*” sincedb_write_interval number 15 间隔多少秒写一次sincedb文件 start_position “beginning”,“end” ” end” 从文件等开头还是结尾读取文件内容,默认是结尾,如果需要导入文件中的老数据,可以设置为“beginning”,该选项只在第一次启动logstash时有效,如果文件已经存在于sincedb的记录内,则此配置无效 stat_interval number 1 间隔多少秒检查一下文件是否被修改,加大此参数将降低系统负载,但是增加了发现新日志的间隔时间 tags array 无 可以在Event中增加标签,以便于在后续的处理流程中使用 type string Event的type字段,如果采用elasticsearch做store,在默认情况下将作为elasticsearch的type

配置文件写好后,就可以启动Logstash了

bin/logstash -f [path]/logstash.conf

自信满满的以为这也很简单么,没想到第一个坑出现了

Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME.

呵呵,找不到java,明明java都装好了的。
难道是linux默认的java版本?删掉之后问题没得到解决,这就蛋疼了。最后终于找到了问题的所在,这里又不得不吐槽下蛋疼的运维,权限设置的这么死。由于没有root权限,在当前目录下没有权限读写文件,导致项目没法启动,只能通过sudo命令启动,但是sudo下的java路径却没有设置,导致项目启动报出找不到java的错误。这里写图片描述

解决方法:
在 bin目录下的
这里写图片描述
这两个文件中指定java地址,最简单粗暴

export JAVA_HOME=[javaPath]

这里写图片描述
这就正常启动了
上面的启动命令是直接启动,加上nohup就可以直接丢到后台启动了

三、elasticsearch
1、安装和下载与Logstash一致就不再赘述了

2、配置
需要配置config目录下的elasticsearch.yml文件,配置也很简单

network.host: 127.0.0.1http.port: 9200cluster.name: es_clusternode.name: m000path.data: /usr/local/elasticsearch/datapath.logs: /usr/local/elasticsearch/logs

设置network.host: 127.0.0.1,http.port: 9200设置访问地址和端口号,否则不能在浏览器中访问。设置cluster.name: es_cluster,node.name: m000,这两个参数主要设置ES集群的集群名称,以及这台机器在集群中的名称。设置path.data: /usr/local/elasticsearch/data,path.logs: /usr/local/elasticsearch/logs,这两个参数主要设置ES存储data和log的路径。
  配置好后启动输入/bin/elasticsearch命令启动es(加入参数-d,es会在后台运行)
这时候又碰到了另外一个问题
这里写图片描述
elasticsearch为了安全,所以不允许root用户启动,所以这里要为elasticsearch创建一个用户,并将elasticsearch分配给该用户,再启动
这里写图片描述
这就正常启动了

四、Kibana
1、配置

主要设置这三个地方,port是kibana监听的端口,host是ip,url是es的地址,kibana的话填9200就ok了
这里写图片描述

四、调试
三个组件都正常起来之后,就可以去调试了。
查看logstash是否同步到es,可以去es查看index,logstash默认的index是logstash-*格式,当然也可以在配置文件里面进行修改这里写图片描述
登录到kibana,首次会让你进行设置es的index,输入你设置的index就可以了。
设置成功后,就可以对日志进行监控了,还是非常方便的。
这里写图片描述

五、后续优化
elk初步是搭建成功了,但是发现如果这套要运用在多机器的环境下,就需要部署多个logstash,很麻烦,于是想有没有方法可以简单化。
1、通过tcp应用端服务器直接将日志发送到elk的服务器上。需要对log的配置文件进行相应的修改,同时logstash需要开通tcp监听端口。不同的log配置也不相同。
2、通过fieldbeat对日志文件进行监听,有改动在发送到elk中。fieldbeat也是elastic旗下的一个组件,主要的功能就是监听文件,发送文件。与logstash不同的是fieldbeat更轻量级,除了监听和发送外基本没有其他功能,部署也十分方便。由于1方法对性能的消耗更大,所以这里采用了2方法。

fieldbeat
下载跟之前的组件没有区别,可以直接从官网上下载,直接解压。fieldbeat的内容很少,就一个文件夹这里写图片描述
对配置文件fieldbeat.yml进行编辑
这里写图片描述
这里设置监听文件的路径,document_type设置kibana展示的type,对多个日志便于区分。
这里写图片描述
这里的multiline设置的是对日志进行合并。如果这个设置不进行设置的话,出现了错误日志,比如这里写图片描述
到了es中就会以多行进行存储这里写图片描述
multiline的设置也比较简单,可以参照官网的文档进行设置https://www.elastic.co/guide/index.html
最后设置fieldbeat的输出这里写图片描述
这里可以发现,fieldbeat可以直接输出到es,不需要通过logstash,由于我们项目对日志并没有什么特别的需求,主要是为了查询日志的方便,所以这里我就直接跳过logstash,直接输出到es。
正常启动fieldbeat就可以了,很简单,却很好用,直接省去了logstash中间件。

注:由于版本不同,不得不说elk版本迭代的速度也太快了,所以配置难免会有所差异,还是以官方文档为准