CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南

现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的。经过仔细的分析和研究,确定下面的架构应该是比较合理的之一(Filebeat也支持直接写到ES)。关于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();。

其次,对于分布式请求,还要解决全局的请求日志上下文关联的问题,这需要依赖与具体的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配置:

[[email protected] ~]$ cd /usr/local/app/elasticsearch-6.2.4/config/
[[email protected] 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
[[email protected] 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了。

[[email protected] bin]$ nohup ./elasticsearch &

[[email protected] bin]$ ps axu | grep elas

windows下浏览器访问下http://192.168.230.128:9200/

这样,ES就安装好了。

ES head安装

需要注意的是,虽然ES head可以认为是es的插件,但是它不能放在$ES_HOME/plugins目录下,因为它并不符合ES插件的规范,否则ES启动会失败。

[[email protected] elasticsearch-head]$ pwd
/usr/local/app/elasticsearch-head
[[email protected] 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! [email protected] install: `node install.js`

npm ERR! Exit status 1

npm ERR! 

npm ERR! Failed at the [email protected] install script ‘node install.js

如果出现上述错误,则执行下列名称:

npm install phantomjs-prebuilt@2.1.14 --ignore-scripts

然后重新执行

npm install

这样ES head就安装好了。不要急着启动!!!

如果只是本机访问,下面的配置修改不是必须的。如果要其他机器访问,则需要修改,一般来说,只要是服务器应用,都是通过远程访问的。

[[email protected] elasticsearch-head]$ vim Gruntfile.js

搜索server,在其options对象属性下增加一个hostname属性,值为"*",如下:

现在就可以启动es head了,如下:

访问下http://192.168.230.128:9100/吧,如下:

logstash安装

logstash和kibana可以使用root用户来启动。

创建一个logstash配置文件,比如logstash-es.conf,配置从filebeat读取数据源,输出到es,为了简化起见,忽略过滤器(实际生产中,一般需要配置过滤器对日志进行规范化处理和分类)

cd /usr/local/app/logstash-6.2.4/config

[[email protected] 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 }
}

为了测试方便,同时开启控制台输入和输出。

[[email protected] config]$ vim jvm.options   #设置最多使用256m内存

-Xms256m
-Xmx256m

启动logstash。

随便输入个字符串测试下,如上,看下http://192.168.230.128:9100/

这样logstash对于写入es和从控制台输入的配置就正确了,filebeat还需要等我们后面验证。我们先完成Kibana的安装与配置。

Kibana安装

kibana也是个nodejs应用。首先来修改kibana的配置:

[[email protected] app]$ cd kibana-6.2.4-linux-x86_64/config/
[[email protected] config]$ ll
总用量 8
-rw-r--r--. 1 zhjh256 zhjh256 4647 6月 2 12:32 kibana.yml
[[email protected] 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 ",但是不影响日志的发送。

参考:

https://serverfault.com/questions/911440/filebeat-cant-connect-to-logstash-on-another-server

https://elasticsearch.cn/question/3157

原文地址:https://www.cnblogs.com/zhjh256/p/9126144.html

时间: 2024-11-05 16:27:37

CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南的相关文章

Centos | Linux 下安装启动 mysql 出现 8618 [ERROR] Aborting,查看日志:Plugin 'FEDERATED' is disabled.

1.试试启动时指定配置文件 ./bin/mysqld_safe --defaults-file=mysql.cnf 或 ./bin/mysqld_safe --defaults-file=mysql.cnf $ 2.试试修改 mysql.cnf(也可能是my.cnf) 在 [mysqld]下指定tmpdir tmpdir = youTmpdir Centos | Linux 下安装启动 mysql 出现 8618 [ERROR] Aborting,查看日志:Plugin 'FEDERATED'

ubuntu下进行android的开发(二):android开发环境搭建

android开发环境搭建主要分两个步骤:安装JDK及安装集成开发环境. 一.安装JDK ubuntu系统自带的有openJDK,要开发android还是需要去官网下载JDK(1.6以上).当前系统JDK版本可以通过java -version指令来查看. 到oracle官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新的JAVA SE开发环境(JDK),我这里下载的是jdk-8u11-linux-x64

Linux下Jenkins+git+gradle 持续集成环境搭建

一.项目介绍 和 linux 环境搭建 本教程讲解 Linux下Jenkins+git+gradle 持续集成环境搭建,后续会加入 gerrit代码审核 和 robotium自动化测试 1.基本流程如下: androidstudio--  gerrit  --- git(github)   ----jenkins ---gradle ----  robotium  结果 使用AndroidStudio 开发,提交到gerrit进行代码审核,审核后提交给git(可以自己搭建git服务也可以使用gi

linux 下 VNC Server安装配置及 eclipse CDT C/C++ 开发环境搭建(我用的是阿里云服务器 ubuntu 12.04 64-bit,无图形化界面)

linux 下 VNC Server安装配置及 eclipse CDT C/C++ 开发环境搭建(我用的是阿里云服务器 ubuntu 12.04 64-bit,无图形化界面): 既然要用 eclipse 可视环境下开发,那首先要安装图形界面喽!!! 对开发者来说,个人认为 linux 选择界面优先选择顺序:Awesome(性能最好) > Xfce4 > gnome > unity-2d //////////////////////////////////////////////// 首先

ubuntu下进行android的开发(一):远程开发环境搭建

ubuntu系统的安装不再记录,已经有了太多的介绍.下面主要记录一些安装后环境的搭建以及一些问题的解决办法. 1.git工具的安装 因为要使用git工具来管理源码,所以安装系统后首先要安装git工具.打开终端执行下面的命令即可. sudo apt-get install qgit 2.使用ssh远程登录服务器进行开发 登录指令:ssh [-x] [email protected]_address(eg:192.18.0.12)   -------这里-X表示支持图形界面,gedit打开和另存都在

windows下用ADT进行AndroidNDK开发的详细教程(从环境搭建 配置到编译全过程)

这几天在学习android NDK的开发,那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Kit),即本地开发工具,简单地说,就是在开发android应用程序的时候,在java类中调用native函数,而native函数的接口也是在java类中定义的,但是native函数最终由本地的C/C++代码实现.简单地说,就是在java中调用C/C++函数.至于为什么要用NDK,我总结了一下,大致有以下几方面原因: 1.提升程序运行效率:众所周知

基于CentOS 7下最小化安装的操作系统搭建Zabbix3.0环境

环境说明 系统版本:CentOS Linux release 7.3.1611 (Core) 内核版本:3.10.0-514.el7.x86_64 Httpd版本:Apache/2.4.6 (CentOS) MariaDB版本:5.5.52-MariaDB PHP版本:PHP 5.4.16 环境准备 [[email protected] ~]# setenforce 0 [[email protected] ~]# sed -i "s/SELINUX=enforcing/SELINUX=disa

CentOS 7下源码安装MySQL 5.7

网上说linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有几十M左右,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度快,安装步骤简单,缺点是安装包很大,300M左右(5.7版本的是600M左右), 对于第二种方法,我搞了一天,无果,到某个环节实在是无法走通,老大那边也不让搞了,隔了几天老大又吩咐我在生产服务器上安装mysql,这次我就按照第一种方法源码安装方式 下载源码安装包 http://dev.my

Centos 6 下安装 erlang 手记

基于openfire的IM项目已经成功上线,接下来的计划准备开始调研 ejabberd. ejabberd  是基于erlang开发的,那么就先从搭建 erlang环境开始吧. 选择的操作系统为Centos6 ,erlang的最新版OTP17.0: 1. 下载最新版erlang otp_17.0 2. 解压缩 tar -zxvf otp_src_17.0 3. 进入解压缩后的目录 4. ./configure --prefix=/opt/erlang  --without-javac 出现错误大