概述

本文介绍使用ELK(elasticsearch、logstash、kibana) + kafka来搭建一个日志系统。主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给logstash,logstash再将日志写入elasticsearch,这样elasticsearch就有了日志数据了,最后,则使用kibana将存放在elasticsearch中的日志数据显示出来,并且可以做实时的数据图表分析等等。

详细

代码下载:http://www.demodashi.com/demo/10181.html

本文介绍使用ELK(elasticsearch、logstash、kibana) + kafka来搭建一个日志系统。主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给logstash,logstash再将日志写入elasticsearch,这样elasticsearch就有了日志数据了,最后,则使用kibana将存放在elasticsearch中的日志数据显示出来,并且可以做实时的数据图表分析等等。

为什么用ELK

以前不用ELK的做法

最开始我些项目的时候,都习惯用log4j来把日志写到log文件中,后来项目有了高可用的要求,我们就进行了分布式部署web,这样我们还是用log4j这样的方式来记录log的话,那么就有N台机子的N个log目录,这个时候查找log起来非常麻烦,不知道问题用户出错log是写在哪一台服务器上的,后来,想到一个办法,干脆把log直接写到数据库中去,这样做,虽然解决了查找异常信息便利性的问题了,但存在两个缺陷:

1,log记录好多,表不够用啊,又得分库分表了,

2,连接db,如果是数据库异常,那边log就丢失了,那么为了解决log丢失的问题,那么还得先将log写在本地,然后等db连通了后,再将log同步到db,这样的处理办法,感觉是越搞越复杂。

现在ELK的做法

好在现在有了ELK这样的方案,可以解决以上存在的烦恼,首先是,使用elasticsearch来存储日志信息,对一般系统来说可以理解为可以存储无限条数据,因为elasticsearch有良好的扩展性,然后是有一个logstash,可以把理解为数据接口,为elasticsearch对接外面过来的log数据,它对接的渠道,有kafka,有log文件,有redis等等,足够兼容N多log形式,最后还有一个部分就是kibana,它主要用来做数据展现,log那么多数据都存放在elasticsearch中,我们得看看log是什么样子的吧,这个kibana就是为了让我们看log数据的,但还有一个更重要的功能是,可以编辑N种图表形式,什么柱状图,折线图等等,来对log数据进行直观的展现。

ELK职能分工

  • logstash做日志对接,接受应用系统的log,然后将其写入到elasticsearch中,logstash可以支持N种log渠道,kafka渠道写进来的、和log目录对接的方式、也可以对reids中的log数据进行监控读取,等等。

  • elasticsearch存储日志数据,方便的扩展特效,可以存储足够多的日志数据。

  • kibana则是对存放在elasticsearch中的log数据进行:数据展现、报表展现,并且是实时的。

怎样用ELK

首先说明一点,使用ELK是不需要开发的,只需要搭建环境使用即可。搭建环境,可以理解为,下载XX软件,然后配置下XX端口啊,XX地址啊,XX日志转发规则啊等等,当配置完毕后,然后点击XX bat文件,然后启动。

Logstash配置

可以配置接入N多种log渠道,现状我配置的只是接入kafka渠道。

配置文件在\logstash-2.3.4\config目录下

要配置的是如下两个参数体:

  • input:数据来源。

  • output:数据存储到哪里。

input {kafka {zk_connect => "127.0.0.1:2181"topic_id => "mylog_topic"}
}
filter {#Only matched data are send to output.
}
output {#stdout{}# For detail config for elasticsearch as output, # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.htmlelasticsearch {action => "index"          #The operation on EShosts  => "127.0.0.1:9200"   #ElasticSearch host, can be array.index  => "my_logs"         #The index to write data to.}
}
Elasticsearch配置

配置文件在\elasticsearch-2.3.3\config目录下的elasticsearch.yml,可以配置允许访问的IP地址,端口等,但我这里是采取默认配置。

Kibana配置

配置文件在\kibana-4.5.4-windows\config目录下的kibana.yml,可以配置允许访问的IP地址,端口等,但我这里是采取默认配置。

这里有一个需要注意的配置,就是指定访问elasticsearch的地址。我这里是同一台机子做测试,所以也是采取默认值了。

# The Elasticsearch instance to use for all your queries.
# elasticsearch.url: "http://localhost:9200"

关于ELK的配置大致上,就这样就可以了,当然其实还有N多配置项可供配置的,具体可以google。这里就不展开说了。

具体的配置请下载运行环境,里面有具体的配置。

和spring aop日志对接

elk环境搭建完毕后,需要在应用系统做日志的aop实现。

部分spring配置
<aop:aspectj-autoproxy />
<aop:aspectj-autoproxy proxy-target-class="true" /><!-- 扫描web包,应用Spring的注解 -->
<context:component-scan  base-package="com.demodashi"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /><context:exclude-filter type="annotation" expression="javax.inject.Named" /><context:exclude-filter type="annotation" expression="javax.inject.Inject" />
</context:component-scan>
部分java代码
package com.demodashi.aop.annotation;
import java.lang.annotation.*;    /**  *自定义注解 拦截service  */    @Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public  @interface ServiceLogAnnotation {    String description()  default "";
}
package com.demodashi.aop.annotation;
import java.lang.annotation.*;    /**  *自定义注解 拦截Controller  */    @Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public  @interface ControllerLogAnnotation {    String description()  default "";
}

代码截图

日志和kafka、和logstash、elasticsearch、kibana直接的关系

ELK,kafka、aop之间的关系

1、aop对日志进行收集,然后通过kafka发送出去,发送的时候,指定了topic(在spring配置文件中配置为 topic="mylog_topic")

2、logstash指定接手topic为 mylog_topic的kafka消息(在config目录下的配置文件中,有一个input的配置)

3、然后logstash还定义了将接收到的kafka消息,写入到索引为my_logs的库中(output中有定义)

4、再在kibana配置中,指定要连接那个elasticsearch(kibana.yml中有配置,默认为本机)

5、最后是访问kibana,在kibana的控制台中,设置要访问elasticsearch中的哪个index。

部署ELK + kafka环境

我本机的环境是jdk8.0,我记得测试的过程中,elasticsearch对jdk有特别的要求,必须是jdk7或者以上。

下载运行环境附件,并解压后,看到如下:

这些运行环境,在每个软件里面,都有具体的启动说明,如kafka的目录下,这样:

按照启动说明的命令来执行,即可启动。

这里需要说明一点,最先启动,应该是zookeeper,然后才是其他的,其他几个没有严格区分启动顺序。

直接在window下面,同一台机子启动即可。除了kibana-4.5.4-windows外,其他几个也是可以在linux下运行的。

运行效果

项目导入到eclipse后,启动,然后访问如下地址:

用户名为 1001 密码为 123

登陆后能看到如下:

本例子是对修改密码做了日志拦截。所以修改密码的动作,能看到打印如下信息:

然后是观察一下aop日志拦截,是否被kafka发送给logstash了,是否被写入了elasticsearch了。

访问elasticsearch,http://127.0.0.1:9200/_plugin/head/ 如下:

注意观察我们定义的my_logs这个索引库是否增加记录了。

访问kibana:

http://127.0.0.1:5601/app/kibana

在输入索引名称后,再点击 create按钮,即可得到如下界面:

然后再点击Discover,界面如下:

如果你看不到数据,记得点击右上角的按钮来选择数据的时间范围:

到这里就完成了,日志的AOP收集,日志的流转,并写入到elasticsearch,并用kibana看数据。

当然kibana还有很重要的一个功能是数据分析图表的配置,主要是通过向导来完成。

高可用实现

现在实现的是一个最基本的日志收集,日志传输,日志存储以及日志展示的一条链路的功能,如果系统上线,还需要做一定的集群,如kafka集群,zookeeper集群,还有elasticsearch集群

注:本文著作权归作者,由demo大师(http://www.demodashi.com)宣传,拒绝转载,转载需要作者授权

ELK + kafka 日志方案相关推荐

  1. ELK+kafka日志系统搭建-实战

    日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠 ...

  2. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 使用FileBeat采集Kafka日志到Elasticsearch 一.需求分 ...

  3. ELK + kafka 分布式日志解决方案

    ELK + kafka 分布式日志解决方案 参考文章: (1)ELK + kafka 分布式日志解决方案 (2)https://www.cnblogs.com/zmsn/p/11639787.html ...

  4. elk + kafka 简单搭建日志分析系统

    elk + kafka 简单搭建日志分析系统 文介绍使用ELK(elasticsearch.logstash.kibana) + kafka来搭建一个日志系统. 想象一下淘宝,它可以对不同的用户实现推 ...

  5. 部署ELK+Kafka+Filebeat日志收集分析系统

    ELK+Kafka+Filebeat日志系统 文章目录 ELK+Kafka+Filebeat日志系统 1.环境规划 2.部署elasticsearch集群 2.1.配置es-1节点 2.2.配置es- ...

  6. 【产品环境】使用ELK搭建日志系统

    为什么80%的码农都做不了架构师?>>>    随着业务不断完善与发展,日志的重要性稳步上升.我们需要从日志中排查错误,以及分析用户行为,为业务发展提供参考意见.因此,需要一套专门的 ...

  7. 云原生下日志方案的架构设计

    上一篇中我们介绍了为什么需要一个日志系统.为什么云原生下的日志系统如此重要以及云原生下日志系统的建设难点,相信DevOps.SRE.运维等同学看了是深有体会的.本篇文章单刀直入,会直接跟大家分享一下如 ...

  8. 微服务开发利器:ELK进行日志采集以及统一处理

    微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等. 我们将重点介绍微服务架构中的日志收 ...

  9. 复习笔记5-nginx、rabbitmq、redis、jenkins、Docker、ELK、日志、Hadoop

    ActiveMQ RabbitMQ Kafka(大数据) RocketMQ(支持分布式) 参考 E:\work\资料\MQ 消息队列使用场景:核心的有 3 个:解耦.异步.削峰. 解耦:BCD 都要从 ...

最新文章

  1. opencv鼠标操作,画矩形
  2. 租房还是买房结婚?大数据告诉你年轻人的真实想法
  3. [云炬创业基础笔记]第六章商业模式测试13
  4. Matalab类定义
  5. 汇编-输出寄存器的值-输出值
  6. http长/短轮询和WebSocket 的介绍和比较
  7. Python连接MySQL数据库(pymysql),DataFrame写入 MySQL(create_engine)- Python代码
  8. hive jdbc 访问 配置_Hive入门级教程(详细)
  9. vcpkg编译库位数总结
  10. ❤️【图文并茂】Chrome浏览器(油猴子)插件安装使用教程❤️
  11. 【桃园恋歌】mmd镜头+动作打包下载.zip
  12. ubuntu server固定ip
  13. 想从事区块链开发? 你应该这么做
  14. 【Java】面向对象编程题
  15. el-upload+额外的参数 , element上传功能组件及其参数的详解
  16. Docker 镜像的存储机制
  17. 《迷途深渊》隐私声明
  18. 用原生js实现淘宝详情页图片放大镜效果
  19. 黑苹果进度条绿屏_clover引导黑苹果安装卡在黑屏白苹果的进度条上,无限彩色风火轮?求解...
  20. 面向对象三大特性-封装

热门文章

  1. xcode 怎么调用midi开发录音_音频应用专业录音声卡:雅马哈UR242声卡教程
  2. 12016.xilinx裸机开发
  3. STM32 软硬件调试
  4. Django 文件上传与下载的相关问题
  5. linux关于权限、目录、重要的指令以及如何使用包管理器
  6. pageable设置size_总结SpringBoot使用Pageable实现分页源码
  7. 【LeetCode】剑指 Offer 38. 字符串的排列
  8. Spring之AOP详解
  9. 合并有序数组java
  10. 训练caffe:registry.count(type) == 0 (1 vs. 0) Solver type Nesterov already registered