写给大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南
现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的。经过仔细的分析和研究,确定下面的架构应该是比较合理的之一(Filebeat也支持直接写到ES),如果可以的话,Filebeat也可以不直接连到Logstash,先写到kafka,然后从kafka写到logstash的kafka插件。关于ELK的各种架构以及优缺点,可以参考https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html。
首先,不管是不是分布式架构,都应该解决请求日志上下文关联的问题,这可以通过Log4j自带的NDC来实现。以Spring MVC为例,可以使用HandlerInterceptor在HandlerInterceptor中设置NDC.push(SessionBeanUtil.getSessionKey(request).substring(0, 8) + "_" + path + "_" + formatter.format(new Date()));,在postHandle中NDC.pop();。
注:最近在学习spring cloud,spring cloud sleuth也包含了MDC跨节点日志上下文跟踪ID的特性,和笔者的思路基本一致。
其次,对于分布式请求,还要解决全局的请求日志上下文关联的问题,这需要依赖与具体的RPC框架来实现,以dubbo为例,可以通过filter在请求端和服务端设置。
第三,服务的调用链应该可以算做是日志框架的范畴,这可以通过zipkin集成来实现。
在实现上,对于服务的调用链可以使用单独的ES存储、也可以在一个大的ES集群中存储为一个index。
从ELK 6.0开始,对于源是log4j的场景,不再建议使用logstash-input-log4j,而是使用Filebeat作为应用端的日志代理,具体可以参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html。
所以,在本文的搭建过程中,笔者采用的也是Filebeat的方案。
环境说明与准备
Filebeat一般安装在产生日志的服务器,这里tomcat在windows 10 x64下,所以Filebeat也需要安装在windows下。
CentOS 7.4 64位 ip 192.168.230.128,ELK安装在centos下,统一安装在/usr/local/app目录下。
版本为安装时的最新版本:
Elasticsearch 6.2.4
Kibana 6.2.4
Logstash 6.2.4
从https://www.elastic.co/cn/downloads下载并解压,如下:
因为ES主要通过restful api对外提供服务,所以一般安装ES时顺带安装elasticsearch-head,它提供了web控制台。elasticsearch-head通过源码的方式托管在git上,所以需要安装下git,同时elasticsearch-head是一个nodejs应用,所以还需要具有node。
所以在正式开始前,我们需要确保centos下下列基础设施已经具备:
1、git已经安装。yum install git
2、如果希望源码安装nodejs,确保gcc满足node的要求,或者直接使用已经编译好的版本, 笔者直接使用编译好的版本,可从https://nodejs.org/en/download/releases/选择具体的版本,基础运行环境最好不要使用最新版本,这里我们使用v4.9。下载解压后即可用。
3、因为elk不能使用root运行,所以需要新建一个elk用户并设置环境变量。
groupadd elk
useradd -g elk elk
设置elk用户的环境变量:
su - elk
vim .bash_profile 增加如下:
export NODE_HOME=/usr/local/app/node-v4.9.1-linux-x64
PATH=$NODE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
export PATH
4、下载ELK套件本身并解压:
cd /usr/local/app
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz
git clone https://github.com/elastic/elasticsearch-head.git
6、因为ES和logstash都是java应用,所以确保安装了JDK 1.8,可以使用centos自带的openjdk,不过生产环境下一般不建议使用openjdk,此处仅为了测试方便。
ELK环境搭建
因为使用的是vmware,总共内存才分配了1G,所以为了避免OOM,对ES以及logstash内存均进行了调整,限制为256M。
ES安装
因为es需要非root用户运行,所以对于ES相关的所有操作均在elk用户下运行。
su - elk
更改ES配置:
[elk@elk1 ~]$ cd /usr/local/app/elasticsearch-6.2.4/config/
[elk@elk1 config]$ ll
总用量 16
-rw-rw----. 1 elk elk 2976 6月 1 16:22 elasticsearch.yml
-rw-rw----. 1 elk elk 2771 6月 2 13:54 jvm.options
-rw-rw----. 1 elk elk 5091 4月 13 04:33 log4j2.properties
[elk@elk1 config]$ pwd
/usr/local/app/elasticsearch-6.2.4/config
vim elasticsearch.yml
# 确保下列参数被正确设置:
cluster.name: logger # ES集群的名字
node.name: node-1
path.data: /usr/local/app/elasticsearch-6.2.4/data
path.logs: /usr/local/app/elasticsearch-6.2.4/log
bootstrap.memory_lock: false # 对于非专用ES,建议设置为false,默认为true
bootstrap.system_call_filter: false
network.host: 0.0.0.0 # 支持远程访问
http.port: 9200 # restful api访问接口
http.cors.enabled: true #允许ES head跨域访问
http.cors.allow-origin: "*" #允许ES head跨域访问
vim jvm.options # JVM参数在这个文件中设置,当然命令行也可以
-Xms256m
-Xmx256m
上述配置调整完成后,就可以启动ES了。
[elk@elk1 bin]$ nohup ./elasticsearch &
[elk@elk1 bin]$ ps axu | grep elas
windows下浏览器访问下http://192.168.230.128:9200/
这样,ES就安装好了。
ES head安装
需要注意的是,虽然ES head可以认为是es的插件,但是它不能放在$ES_HOME/plugins目录下,因为它并不符合ES插件的规范,否则ES启动会失败。
[elk@elk1 elasticsearch-head]$ pwd
/usr/local/app/elasticsearch-head
[elk@elk1 elasticsearch-head]$ npm config set registry https://registry.npm.taobao.org
npm install
Please report this full log at https://github.com/Medium/phantomjs npm ERR! Darwin 15.0.0 npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" npm ERR! node v4.4.3 npm ERR! npm v3.10.9 npm ERR! code ELIFECYCLE npm ERR! phantomjs-prebuilt@2.1.14 install: `node install.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js
如果出现上述错误,则执行下列名称:
npm install phantomjs-prebuilt@2.1.14 --ignore-scripts
然后重新执行
npm install
这样ES head就安装好了。不要急着启动!!!
如果只是本机访问,下面的配置修改不是必须的。如果要其他机器访问,则需要修改,一般来说,只要是服务器应用,都是通过远程访问的。
[elk@elk1 elasticsearch-head]$ vim Gruntfile.js
搜索server,在其options对象属性下增加一个hostname属性,值为"*",如下:
现在就可以启动es head了,如下:
访问下http://192.168.230.128:9100/吧,如下:
这里状态为yellow的原因在于默认情况下,Elasticsearch为每个索引分配5个分片和1个副本(5个主分片,5个副本分片),也就是双节点模式,而我们只有一个节点。
logstash安装
logstash和kibana可以使用root用户来启动。
创建一个logstash配置文件,比如logstash-es.conf,配置从filebeat读取数据源,输出到es,为了简化起见,忽略过滤器(实际生产中,一般需要配置过滤器对日志进行规范化处理和分类)
cd /usr/local/app/logstash-6.2.4/config
[elk@elk1 config]$ vim logstash-es.conf
input {
stdin { }
beats {
port => 5000
ssl => false
}
}
output {
elasticsearch {
action => "index"
hosts => "127.0.0.1:9200"
index => "logstash-%{+YYYY-MM}"
}
stdout { codec=> rubydebug }
}
为了测试方便,同时开启控制台输入和输出。
[elk@elk1 config]$ vim jvm.options #设置最多使用256m内存
-Xms256m
-Xmx256m
启动logstash。
随便输入个字符串测试下,如上,看下http://192.168.230.128:9100/
这样logstash对于写入es和从控制台输入的配置就正确了,filebeat还需要等我们后面验证。我们先完成Kibana的安装与配置。
Kibana安装
kibana也是个nodejs应用。首先来修改kibana的配置:
[elk@elk1 app]$ cd kibana-6.2.4-linux-x86_64/config/
[elk@elk1 config]$ ll
总用量 8
-rw-r--r--. 1 zhjh256 zhjh256 4647 6月 2 12:32 kibana.yml
[elk@elk1 config]$ vim kibana.yml # 确保下列配置正确
server.port: 5601
server.host: "192.168.230.128"
elasticsearch.url: "http://localhost:9200"
上述配置完成后,就可以启动了。
访问下http://192.168.230.128:5601。
第一次访问的时候,会要求设置Index Pattern,因为我们在logstash-es.conf中设置为logstash-%{+YYYY-MM},所以设置为logstash-*就可以了。
Discover是主要的查询交互界面,如下所示:
搜索下,我们刚才在控制台输入的测试文字:
有时候在访问discover的时候,提示no results found,如下所示:
这通常是由于默认的查询时间范围太短的原因,可以通过右上角的TimeRange来设置查询的时间范围。
到这里,ELK的环境搭建与基本配置就完成了。
更多的配置与优化参见各官方文档https://www.elastic.co/guide/index.html。后续有时间的话,笔者会再写一篇。
Filebeat安装与配置
采用Filebeat作为源端代理之后,准确的说,跟log4j已经没有关系了。所以这里假设读者知道log4j的配置,生成的文件在d:\httx\logs目录。
因为windows下Filebeat的启动脚本是使用powershell脚本编写的,所以确保安装了ps,windows 10下自带。
从https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-windows-x86_64.zip下载windows版本的filebeat。filebeat可以安装在任何目录,这里以D:\chrome下载\filebeat为例。
打开配置文件D:\chrome下载\filebeat\filebeat.yml,确保下列设置正确:
filebeat.prospectors:
- type: log
enabled: true #启用配置
paths:
- D:\httx\logs\* #设置监控路径
#output.elasticsearch: #禁用ES写入
output.logstash: #启用logstash写入
# The Logstash hosts
hosts: ["192.168.230.128:5000"]
安装与启动filebeat。
打开powershell,执行如下命令:
PS C:\Users\admin> cd 'D:\chrome下载\filebeat'
PS D:\chrome下载\filebeat> .\install-service-filebeat.ps1 安全警告
请只运行你信任的脚本。虽然来自 Internet 的脚本会有一定的用处,但此脚本可能会损坏你的计算机。如果你信任此脚本,请使用
Unblock-File cmdlet 允许运行该脚本,而不显示此警告消息。是否要运行 D:\chrome下载\filebeat\install-service-filebeat.ps1?
[D] 不运行(D) [R] 运行一次(R) [S] 暂停(S) [?] 帮助 (默认值为“D”): R Status Name DisplayName
------ ---- -----------
Stopped filebeat filebeat PS D:\chrome下载\filebeat> Start-Service filebeat
PS D:\chrome下载\filebeat> Stop-Service filebeat
filebeat的日志在C:\ProgramData\filebeat\logs目录下,这是写死的,不知道哪里可以更改。
filebeat会定期输出日志以及遇到的异常信息。
最后,我们再回到kibana控制台,看下log4j相关的日志,如下:
左边控制要显示哪些列,比如显示来源和主机:
到此为止,整个ELK+log4j的集成本身就完成了。但是要达到高效可用的步骤,下列问题还需要进一步研究:
1、filebeat读取文件似乎是以行为单位,这在exception堆栈下是不可接受的,需要logstash或者其他方式二次处理。
2、es head的控制台应该来说作为es的监控还可以,但是作为日志交互基本上没什么用,效果太差了。kibana还不错,只不过filter不是起码应该固定么??
3、elk的详细配置以及优化。
4、filebeat日志中出现"sync.go:105: ERR Failed to publish events (host: 10.172.0.165:5044:10200), caused by: write tcp ",但是不影响日志的发送。
参见ELK最新版6.2.4学习笔记-Logstash和Filebeat解析。对于log4j以及log4j2日志解析为每个字段,后续将补充“使用grok将log4j/log4j2日志解析为ES字段”。
参考:
https://serverfault.com/questions/911440/filebeat-cant-connect-to-logstash-on-another-server
https://elasticsearch.cn/question/3157
其他:
[ERROR][logstash.plugins.registry] Tried to load a plugin's code, but failed. {:exception=>#<LoadError: no such file to load -- logstash/inputs/log4j>, :path=>"logstash/inputs/log4j", :type=>"input", :name=>"log4j"}
解决方法:运行bin/logstash-plugin install logstash-input-log4j 安装log4j插件,默认情况下,插件没有绑定,参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
log4j:ERROR Could not connect to remote log4j server at [192.168.230.128]. We will try again later
解决方法:logstash的log4j监听地址由127.0.0.1改成ip比如192.168.230.128
log4j:WARN Detected problem with connection: java.net.SocketException: Connection reset by peer: socket write error
采用低版本的ELK比如2.x版本,ELK 2.x之后的版本就是5.x、6.x,3.x、4.x是跳版了的。
写给大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南的更多相关文章
- ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建
0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...
- 写给大忙人的spring cloud 1.x学习指南
这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...
- CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
经过分析/etc/profile为入口的,基本是登录后执行的变量,而使用chkconfig添加的服务多变以守护经常运行,没有登录. CentOS 7下使用chkconfig添加的服务无法使用/etc/ ...
- Linux下Jenkins+git+gradle持续集成环境搭建
Linux下Jenkins+git+gradle持续集成环境搭建 来源:IT165收集 发布日期:2014-08-22 21:45:50 我来说两句(0)收藏本文 一.项目介绍 和 linux ...
- 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...
- visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解
一直以来,相信绝大部分的开发都是windows/mac下做开发,尤其是非嵌入式和qt系的,而开源服务器程序绝大部分都是跑在Linux下,几乎就没有跑在windows下的.一直以来开发人员都是在wind ...
- 写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)
注:个人对偏向于底层基本上拿来就用的应用,倾向于使用安装包,直接yum或者rpm安装:而对于应用层面控制较多或者需要大范围维护的,倾向于直接使用tar.gz版本. 对于linux下的ftp服务器,实际 ...
- Centos | Linux 下安装启动 mysql 出现 8618 [ERROR] Aborting,查看日志:Plugin 'FEDERATED' is disabled.
1.试试启动时指定配置文件 ./bin/mysqld_safe --defaults-file=mysql.cnf 或 ./bin/mysqld_safe --defaults-file=mysql. ...
- Mac下持续集成-Mac下Tomcat+Jenkins集成环境搭建
一.MAC安装jdk及环境变量配置 1)访问Oracle官网 http://www.oracle.com,浏览到首页的底部菜单 ,然后按下图提示操作: 2)下载完成后点击安装包,按提示即可完成安装. ...
随机推荐
- nodejs 网上下载图片到本地,并判断图片路径是否存在
var http = require("http"); var fs = require("fs"); var server = http.createServ ...
- 一个简单的MapReduce示例(多个MapReduce任务处理)
一.需求 有一个列表,只有两列:id.pro,记录了id与pro的对应关系,但是在同一个id下,pro有可能是重复的. 现在需要写一个程序,统计一下每个id下有多少个不重复的pro. 为了写一个完整的 ...
- sparse.coo_matrix()
coo_matrix.tocsr(copy = False ) 将此矩阵转换为压缩稀疏行格式,重复的条目将汇总在一起. 举例: from numpy import array from scipy.s ...
- (转载)spring RestTemplate用法详解
前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json.结合xml的view显示xml文档.那么这些数据除了在WebBrowser中用JavaScrip ...
- python filter函数应用,过滤字符串
>>> candidate = 'dade142.;!0142f[.,]ad' >>> filter(str.isdigit, candidate) #保留数字 ' ...
- Windows Server 2008 安装 10.2.0.5 单实例
需求:Windows Server 2008 安装 10.2.0.5 单实例 原以为非常简单的一次任务,实际却遇到了问题,故记录一下. 1.安装10.2.0.1 2.安装10.2.0.4 3.安装10 ...
- Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1
Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...
- ip and port check 正则
在网页开发中可能会遇到需要对在页面输入的ip和端口进行正确性验证,那么正则表达式就是最有力的工具: 1:ip的正则表达式: 格式是由“.”分割的四部分,每部分的范围是0-255: 每段的正则可以分几部 ...
- UVa-1025城市里的间谍 A Spy in the Metro
原题 城市里的间谍 分析 动态规划,dp[i][j]表示你在时刻i,车站j,最少还要等待的时间. 边界条件d[T][n]=0 已经到达,其他d[T][i]=inf不可达. 在一个站点时,有以下三种决策 ...
- factory源码分析——component_registry和object_registry
registry类主要是为object和component提供一个轻量级的代理(lightweight proxy)来方便factory实现: registry class从uvm_object_wr ...