ELK分布式日志收集系统

ELK分布式日志收集系统

一、传统系统日志收集的问题

在传统项目中,如果在生产环境中,有多台不同的服务器集群,如果生产环境需要通过日志定位项目的Bug的话,需要在每台节点上使用传统的命令方式查询,这样效率非常底下。
通常,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

二、ELK分布式日志收集系统介绍

  1. ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
  2. Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
  3. Kibana是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

三、Logstash介绍

Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
核心流程:Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

四、ELK分布式日志收集原理

  1. 每台服务器集群节点安装Logstash日志收集系统插件
  2. 每台服务器节点将日志输入到Logstash中
  3. Logstash将该日志格式化为json格式,根据每天创建不同的索引,输出到ElasticSearch中
  4. 浏览器使用安装Kibana查询日志信息

五、ELK环境搭建

(1)新建SpringBoot项目作为日志的提供者

在application.properties中添加:

logging.file.path=app_log/log

此时运行该项目在根目录下会生成app_log/log文件夹,下面有spring.log。里面便存储着我们运行时的日志信息。
为了效果演示,添加Controller。

@RestController
@Slf4j
public class TestController {

    @GetMapping("/GetTest")
    public String GetTest(){
        log.info("哈哈哈");
        log.error("哦哦哦哦哦");
        log.warn("警告");
        return "success";
    }
}

下面打包成jar包,上传至CenterOS服务器,并启动。

(2)安装Elasticsearch

Elasticsearch的安装在我博客中有详细的安装说明及集群的搭建,这部分可参考:

https://blog.csdn.net/qq_43692950/article/details/107689309

(3)配置Logstash环境

Logstash环境要和上面springboot项目部署的在一台主机上。
下载链接:

https://elasticsearch.cn/download/

这里我用的logstash-6.4.3版本。
将logstash-6.4.3上传至服务器:

scp G:\Optimize\Util\elasticserch\logstash-6.4.3.tar.gz [email protected]:/home/bxc/bxc/es

解压:

tar -zxvf logstash-6.4.3.tar.gz

进入bin文件夹创建config文件夹:

cd logstash-6.4.3/bin
mkdir config

创建文件log.conf 写入下面内容:

input {
    # 从文件读取日志信息 输送到控制台
    file {
        path => "/home/bxc/bxc/log/app_log/log/spring.log" ##指向上面springboot项目运行日志生成的路径
        codec => "json" ## 以JSON格式读取日志
        type => "elasticsearch"
        start_position => "beginning"
    }
}

# filter {
#
# }

output {
    # 标准输出 
    # stdout {}
    # 输出进行格式化,采用Ruby库来解析日志   
     stdout { codec => rubydebug }
     elasticsearch {
        hosts => ["192.168.2.125:9200"]  ##es的地址
        index => "es-%{+YYYY.MM.dd}" ##es 索引的生成方式
    }	      

}

回到bin目录,执行:
./logstash -f /config/log.conf

此时,访问原来springboot项目的Controller,看这边控制台会打印日志信息,证明配置成功。
ELK分布式日志收集系统_第1张图片

六、配置Kibana环境

我这边直接下载的windows环境下的,然后设置远程服务器的es地址即可。
下载链接:

https://elasticsearch.cn/download/

注意:Kibana环境要和你的es的环境版本一致。

修改kibana-6.4.3-windows-x86_64\config\kibana.yml

elasticsearch.url: "http://192.168.2.125:9200"

然后点击bin/kibana.bat运行
最后在浏览器输入下面地址即可看到kibana界面:

http://localhost:5601

找到dev tools开发工具里,这在边就可以对es进行各种操作了。
比如:查看刚才的信息:

GET /es-2020.07.31/_search

反馈结果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 21,
    "max_score": 1,
    "hits": [
      {
        "_index": "es-2020.07.31",
        "_type": "doc",
        "_id": "KRGeo3MBinEzx9s_9x-s",
        "_score": 1,
        "_source": {
          "host": "localhost.localdomain",
          "tags": [
            "_jsonparsefailure"
          ],
          "type": "elasticsearch",
          "@timestamp": "2020-07-31T06:46:11.271Z",
          "@version": "1",
          "path": "/home/bxc/bxc/log/app_log/log/spring.log",
          "message": "2020-07-31 14:46:10.929  WARN 23932 --- [http-nio-8080-exec-8] c.bxc.testelk.Controller.TestController  : 警告"
        }
      },
      {
        "_index": "es-2020.07.31",
        "_type": "doc",
        "_id": "KhGeo3MBinEzx9s_-B8r",
        "_score": 1,
        "_source": {
          "host": "localhost.localdomain",
          "tags": [
            "_jsonparsefailure"
          ],
          "type": "elasticsearch",
          "@timestamp": "2020-07-31T06:46:11.258Z",
          "@version": "1",
          "path": "/home/bxc/bxc/log/app_log/log/spring.log",
          "message": "2020-07-31 14:46:10.489 ERROR 23932 --- [http-nio-8080-exec-5] c.bxc.testelk.Controller.TestController  : 哦哦哦哦哦"
        }
      },
      {
        "_index": "es-2020.07.31",
        "_type": "doc",
        "_id": "HxGeo3MBinEzx9s_ah8z",
        "_score": 1,
        "_source": {
          "host": "localhost.localdomain",
          "tags": [
            "_jsonparsefailure"
          ],
          "type": "elasticsearch",
          "@timestamp": "2020-07-31T06:45:33.944Z",
          "@version": "1",
          "path": "/home/bxc/bxc/log/app_log/log/spring.log",
          "message": "2020-07-31 14:45:33.029  INFO 23932 --- [http-nio-8080-exec-1] c.bxc.testelk.Controller.TestController  : 哈哈哈"
        }
      },
    ]
  }
}

至此一个简易的ELK环境就搭建成功了!

你可能感兴趣的:(搜索引擎,SpringBoot,分布式,java,linux)