前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >搭建ELK日志分析系统

搭建ELK日志分析系统

作者头像
菲宇
发布于 2019-06-11 09:47:24
发布于 2019-06-11 09:47:24
1.3K00
代码可运行
举报
文章被收录于专栏:菲宇菲宇
运行总次数:0
代码可运行

ELK Stack 是Elasticsearch、Logstash、Kiban三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。 ELK Stack成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,ELK Stack 具有如下几个优点: • 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用; • 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计; • 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应; • 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的; • 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。 官网地址:https://www.elastic.co/cn/ 官网权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html 安装指南: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/rpm.html Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。 Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。 Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。

环境 : 一台 centos7.3 IP地址:192.168.0.209

软件版本 : ElasticSearch 6.3.2 Logstash 6.3.2 Kibana 4.3.1 JDK 1.8.0_181

下载好JDK 放在路径/usr/local/java编辑配置文件 /etc/profile

export JAVA_HOME=/usr/local/java/jdk1.8.0_181

export PATH=$JAVA_HOME/bin:$PATH

加入这两句以后 然后 source /etc/profile

确认生效 java -version

[root@localhost ~]# java -version

java version "1.8.0_181"

Java(TM) SE Runtime Environment (build 1.8.0_181-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.77-b13, mixed mode)

1、 搭建 ElasticSearch

下载ElasticSearch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.tar.gz
tar -xvf elasticsearch-6.3.2.tar.gz -C /usr/local/elasticsearch-6.3.2/

创建用户,并将ElasticSearch安装权限归新用户所有

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useradd feiyu
passwd feiyu
chown -R feiyu:feiyu elasticsearch-6.3.2/

修改配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi config/elasticsearch.yml
network.host: 你自己的服务器ip
http.port: 9200

启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[feiyu@localhost elasticsearch-6.3.2]$ bin/elasticsearch -d

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[feiyu@localhost elasticsearch-6.3.2]$ curl http://192.168.0.209:9200
{
  "name" : "a-_Hcd6",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "0f60tE6DSZWBa0xll4SoSA",
  "version" : {
    "number" : "6.3.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "053779d",
    "build_date" : "2018-07-20T05:20:23.451332Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

可能遇到的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
问题1:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解决方法:
#切换到root用户修改
vim /etc/security/limits.conf
# 在最后面追加下面内容
feiyu hard nofile 65536
feiyu soft nofile 65536
修改后重新登录 feiyu用户,使用如下命令查看是否修改成功
ulimit -Hn 65536

问题:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方法 提高vm.max_map_count 的大小
# 切换到root用户
vim /etc/sysctl.conf
# 在最后面追加下面内容
vm.max_map_count=262144
# 使用 sysctl -p 查看修改后的结果
sysctl -p

问题:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
解决方法:
# 由于elasticsearch5.0默认分配jvm空间大小为2g,修改jvm空间分配
# 如果使用虚拟机安装,内存最好不小于2G
# vim config/jvm.options  
-Xms512m
-Xmx512m

安装elasticsearch-head插件 安装docker镜像或者通过github下载elasticsearch-head项目都是可以的,1或者2两种方式选择一种安装使用即可 1. 使用docker的集成好的elasticsearch-head

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 9100:9100 mobz/elasticsearch-head:5 

docker容器下载成功并启动以后,运行浏览器打开http://localhost:9100/ 2. 使用git安装elasticsearch-head

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y epel git
yum install -y npm
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

检查端口是否起来 netstat -antp |grep 9100 浏览器访问测试是否正常http://IP:9100/

2、搭建NGINX

请参照《Centos7下Nginx编译安装与脚本安装的记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;

#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
   worker_connections  1024;
}

http {
  
    upstream kibana4 {  #对Kibana做代理  
        server 127.0.0.1:5601 fail_timeout=0;
    }
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
                     
     log_format json '{"@timestamp":"$time_iso8601",'   #配置NGINX的日志格式 json
                        '"host":"$server_addr",'
                        '"clientip":"$remote_addr",'
                        '"size":$body_bytes_sent,'
                        '"responsetime":$request_time,'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamhost":"$upstream_addr",'
                        '"http_host":"$host",'
                        '"url":"$uri",'
                        '"xff":"$http_x_forwarded_for",'
                        '"referer":"$http_referer",'
                        '"agent":"$http_user_agent",'
                        '"status":"$status"}';
     access_log /var/log/nginx/access.log_json json;   #配置日志路径 json格式
     error_log /var/log/nginx/error.log;  

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }



    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

  
server {
    listen               *:80;
    server_name          kibana_server;
    access_log           /var/log/nginx/kibana.srv-log-dev.log;
    error_log            /var/log/nginx/kibana.srv-log-dev.error.log;


    location / {
        root   /var/www/kibana;
        index  index.html  index.htm;
    }

    location ~ ^/kibana4/.* {
        proxy_pass           http://kibana4;
        rewrite              ^/kibana4/(.*)  /$1 break;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     Host            $host;
        auth_basic           "Restricted";
        auth_basic_user_file /etc/nginx/conf.d/kibana.myhost.org.htpasswd;
    }

}
}

3、搭建 Logstash

官方安装手册

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.2.tar.gz
tar -zxvf logstash-6.3.2.tar.gz -C /usr/local/logstash-6.3.2
cd /usr/local/logstash-6.3.2/bin
vim stdin.conf #编写配置文件
input{
        file {
                path => "/var/log/nginx/access.log_json"  #NGINX日志地址 json格式
               codec => "json"  json编码
        }
}
filter {
        mutate {
                split => ["upstreamtime", ","]    
        }
        mutate {
                convert => ["upstreamtime", "float"]
        }
}
output{

        elasticsearch {
                hosts => ["192.168.0.209:9200"]   #elasticsearch地址
                index => "logstash-%{type}-%{+YYYY.MM.dd}"   #索引
                document_type => "%{type}"    
                workers => 1
                flush_size => 20000        #传输数量 默认500
                idle_flush_time => 10      #传输秒数  默认1template_overwrite => true   
        }
}
 ./logstash -f stdin.conf &  #后台启动
启动成功以后 打开刚才搭建的web服务器  es就能看到数据

创建一个软连接,每次执行命令的时候不用在写安装路劲(默认安装在/usr/local下) ln -s /usr/local/logstash-6.3.2/bin/logstash /bin/ 执行logstash的命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# logstash -e 'input { stdin { } } output { stdout {} }'
:
  -e          执行操作
  input       标准输入
  { input }   插件
  output      标准输出
  { stdout }  插件

运行成功以后输入: nihao stdout返回的结果:

4、搭建Kibana

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
tar xf kibana-4.3.1-linux-x64.tar.gz
cd /usr/local/kibana-4.3.1-linux-x64/
vim ./config/kibana.yml

elasticsearch.url: "   只需要修改URL为ElasticSearch的IP地址
./kibana &  后台启动

启动成功以后 会监听 5601端口

全部搭建好了以后就可以用Kibana查看

地址 : 192.168.88.250:5601

如果create灰色的 说明没有创建索引 打开你的nginx服务器 刷新几下 采集一下数据

然后 选择 左上角的 Discover

数据可能会出不来 那是因为 Kibana 是根据时间来匹配的 并且 因为 Logstash的采集时间使用的UTC 永远早8个小时

所以设置时间 要设置晚8个小时以后

设置好了时间以后 。数据基本就会看的到

这里可以设置你想看到的任意 数据 选择 add 就能看到的 不想看 可以remove

还有后面的 Visualize 也可以个性化定制图标

基本就到此结束了,另外如果 Kibana出不来数据 一般都是因为时间设置不正确。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.8K0
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型(Generics)是一个强大的语言特性,它允许在类、接口和方法中使用参数化类型,从而实现代码的重用、增强类型安全性,并提升代码的可读性。泛型的引入解决了 Java 编程中常见的类型转换问题,使得我们能够编写更加灵活且健壮的代码。然而,泛型背后的类型擦除(Type Erasure)机制和一些高级特性也给我们带来了一定的挑战。
科技新语
2024/10/11
1800
Java 泛型深入解析:类型安全与灵活性的平衡
Java知识点总结之Java泛型
作者:苏生 链接: https://segmentfault.com/a/1190000014824002 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底就是“模版” 优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。 泛型主要使用在集合中 import java.util.ArrayList; import java.util.List; public class Demo01 { // 不使用泛型,存取数据麻烦
用户1257393
2018/07/30
5730
编程思想 之「泛型」
对于一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类型。如果我们要想编写可以应用于多种类型的代码,这种限制就会对代码产生非常大的束缚。在面向对象的语言中,多态算是一种泛化的机制,因为我们可以将方法的参数类型设为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数。为了实现将代码复用于多种类型,Java SE5 引入了一个非常重要的概念“泛型”,其含义为:泛化的代码,适用于多种具体的类型。遗憾的是,虽然 Java 泛型的出现使得 Java 向前迈进了一大步,但是由于 Java 语言是在发行近 10 年后才引入泛型的,为了兼容老代码,Java 的泛型并不纯粹。
CG国斌
2019/05/26
4770
深入理解 Java 泛型
泛型要求在声明时指定实际数据类型,Java 编译器在编译时会对泛型代码做强类型检查,并在代码违反类型安全时发出告警。早发现,早治理,把隐患扼杀于摇篮,在编译时发现并修复错误所付出的代价远比在运行时小。
静默虚空
2022/03/23
4390
深入理解 Java 泛型
夯实Java基础系列13:深入理解Java中的泛型
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/07
4200
Java中的泛型(很细)
非常好,让我们深入探讨Java中的泛型这个重要主题。我将按照之前提供的框架,为您创作一篇全面而专业的技术博客文章。
程序员朱永胜
2024/07/18
2280
Java中的泛型(很细)
【Java】泛型
🍊 泛型(Generics)是Java编程语言中的一个强大的特性,它提供了 编译时类型安全检测机制,这意味着可以在编译期间检测到非法的类型。泛型的使用减少了程序中的强制类型转换和运行时错误的可能性。
IsLand1314
2024/10/21
1510
【Java】泛型
泛型的特点
在 Java SE 1.5 之后,泛型(Generics)作为一项重要的语言特性被引入。泛型让开发者可以编写更通用、类型安全的代码,并允许在编译时进行类型检查,从而减少运行时错误。正如《Java 核心技术》中的定义:“泛型意味着编写的代码可以被不同类型的对象所重用。”
繁依Fanyi
2024/10/26
1460
Java泛型详解,史上最全图文详解「建议收藏」
毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。
全栈程序员站长
2022/09/08
9630
Java泛型深入理解「建议收藏」
在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性。此外,如果将方法参数声明为接口,将会更加灵活。
全栈程序员站长
2022/09/10
8830
【Java基础】JavaCore核心-泛型技术
互联网小阿祥
2023/05/28
3870
【Java基础】JavaCore核心-泛型技术
深入理解Java包装类与泛型的应用
在Java中,装箱(boxing)是指将基本数据类型(如int, char, double等)转换为对应的包装类对象(如Integer, Character, Double等)的过程。相反,拆箱(unboxing)是指将包装类对象转换回基本数据类型的过程。
学无止尽5
2024/11/29
1790
深入理解Java包装类与泛型的应用
那些年我们在Java泛型上躺过的枪---万恶的泛型擦除【享学Java】
泛型(Generics),从字面的意思理解就是泛化的类型,即参数化类型。 我们都知道,泛型是JDK5提供的一个非常重要的新特性,它有非常多优秀的品质:能够把很多问题从运行期提前到编译器,从而使得程序更加的健壮。
YourBatman
2019/09/03
1K0
那些年我们在Java泛型上躺过的枪---万恶的泛型擦除【享学Java】
【面试题精讲】泛型&通配符
泛型(Generics)是 Java 中的一种特性,它允许我们在定义类、接口和方法时使用类型参数。通过使用泛型,我们可以编写更加通用和可复用的代码。
程序员朱永胜
2023/10/14
3930
Java 泛型:概念、语法和应用
上述代码中,类 MyGenericClass 定义了一个泛型类型参数 T,它可以用来表示任何数据类型。
小尘要自信
2023/10/10
2510
细说 Java 泛型及其应用
当获取列表中的第二个元素时,会报错,java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。这是常见的类型转换错误。
aoho求索
2019/05/07
7260
年后跑路第一战,从Java泛型学起!
大家好,我是麦洛,今天来复习一下泛型。JDK 5.0 引入了 Java 泛型,允许设计者详细地描述变量和方法的类型要如何变化,使得代码具有更好的可读性。本文章是对 Java 中泛型的快速介绍,包含泛型背后的目标以及使用泛型如何提高我们代码的质量。
麦洛
2022/03/14
7360
年后跑路第一战,从Java泛型学起!
Java的“泛型”特性,你以为自己会了?(万字长文)
使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合、反射、泛型、注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛型。
小灰
2022/09/01
4390
Java的“泛型”特性,你以为自己会了?(万字长文)
Java泛型详解:为什么使用泛型?如何使用泛型?
大家好!今天我要和大家一起探讨的是Java泛型,一个让我们的代码更加灵活、可读性更强的强大特性。相信很多人都听说过泛型,但对于为什么使用泛型、如何使用泛型以及泛型的实现原理和本质,可能还有些困惑。别担心,我会通过通俗易懂的语言,带你深入了解这一话题,并为你提供一些实例演示。
默 语
2024/11/20
3560
相关推荐
带你深挖Java泛型类型擦除以及类型擦除带来的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档