ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5-17 ELK 日志采集查询保存

2022-07-17 13:34:44  阅读:159  来源: 互联网

标签:ELK 17 查询 日志 数据 logstash ES


ELK简介

什么是ELK

ELK:

E:Elasticsearch 全文搜索引擎

L:logstash 日志采集工具

K:Kibana ES的可视化工具

ELK是当今业界非常流行的日志采集保存和查询的系统

我们编写的程序,会有很多日志信息,但是日志信息的保存和查询是一个问题

idea控制台是临时显示的位置,我们可以将它保存在文件中

但是即使保存在文件中,海量日志信息要想查询需要的条目也是问题

所以我们使用ELK来保存

为什么需要ELK

保存并能够快速便捷的查询查看日志信息就是新出现的需求了

ELK这个组合可以完成这个任务

Elasticsearch负责将日志信息保存,查询时可以按关键字快速查询

那么这些日志怎么收集呢?

利用logstash这个软件可以监听一个文件,将这个文件中出现的内容经过处理发送到指定端口

我们就可以监听我们程序输出的日志文件,然后将新增的日志信息保存到ES中

Kibana来负责进行查询和查看结果

日志的管理工具还有一套叫链路追踪

和ELK有类似的效果,感兴趣的同学可以自己搜索

Logstash

什么是logstash

Logstash是一款开源的日志采集,处理,输出的软件,每秒可以处理数以万计条数据,可以同时从多个来源采集数据,转换数据,然后将数据输出至自己喜欢的存储库中(官方推荐的存储库为Elasticsearch)

上面图片数据源可以是任何产生数据的介质,数据库,redis,java的日志文件均可

输出目标一般也是能够保存数据的媒体,数据库,redis,ES等

LogStash内部有3个处理数据的步骤

  • input 将数据源的数据采集到Logstash
  • filter (非必要)如果需要可以对采集到的数据进行处理
  • output 将处理好的数据保存到目标(一般就是ES)

其中采集数据的用法比较多样,还支持各种插件

logstash实现数据库和ES数据的同步

logstash还有一个非常常用的功能

就是能够自动完成数据库数据和ES中数据的同步问题

实现原理

我们可以配置logstash监听数据库中的某个表

一般设计为监听表中数据的变化,在规范的数据表结构中,logstash可能监听gmt_modified列

只要gmt_modified列数据有变化,就收集变化的数据行,将这行数据的信息更新到ES

下面我们就在虚拟机环境下实现搜索操作

实现虚拟机搜索功能

之前我我们已经修改了yml文件,将搜索的目标更换为虚拟机中的ES

在虚拟机的连接环境中,我们使用SpuEntity来实现ES的连接

我们可以看到SpuEntity类中没有任何编写分词的属性

原因是为了更高效的实现分词,logstash将所有需要分词的列拼接组合成了一个新列search_text

当需要查询时只需要查询search_text字段即可

修改持久层

我们需要修改一下SpuForElasticRepository的代码

@Repository
public interface SpuForElasticRepository extends
                        ElasticsearchRepository<SpuEntity,Long> {

    // 所有更新数据的操作都由Logstash负责,这里无需编写数据更新代码

    // 方法名查询
    Page<SpuEntity> querySpuEntitiesBySearchTextMatches(
                                String keyword,Pageable pageable);
    // 或者调用查询语句的方法
    @Query("{\"match\":{\"search_text\":{\"query\":\"?0\"}}}")
    Page<SpuEntity> querySearchByText(String keyword,Pageable pageable);
}

业务逻辑层接口

因为实体类泛型类型的变化

ISearchService接口中的返回值泛型也要修改一下

public interface ISearchService {

    // ES分页查询spu的方法
    //      ↓↓↓↓↓↓↓↓↓↓↓
    JsonPage<SpuEntity> search(String keyword, Integer page, Integer pageSize);

    // 向ES中加载数据的方法
    void loadSpuByPage();
}

原来的业务逻辑层实现类,要废弃,可以删除

如果不想删除也要把之前代码注释,还是必须删除@Service注解

原有Service(Search)LocalServiceImpl修改为

//@Service
//@Slf4j
@Deprecated
public class ServiceLocalServiceImpl {
}

新建SearchRemoteServiceImpl实现类代码如下

// 实现查询远程服务器ES的业务逻辑层实现类
@Service
@Slf4j
public class SearchRemoteServiceImpl implements ISearchService {

    //注入查询ES的Repository
    @Autowired
    private SpuForElasticRepository spuForElasticRepository;
    @Override
    public JsonPage<SpuEntity> search(String keyword, Integer page, Integer pageSize) {
        Page<SpuEntity> spuEntities=spuForElasticRepository
                .querySearchByText(keyword, PageRequest.of(page-1,pageSize));
        JsonPage<SpuEntity> jsonPage=new JsonPage<>();
        //赋值分页参数
        jsonPage.setPage(page);
        jsonPage.setPageSize(pageSize);
        // 总页数
        jsonPage.setTotalPage(spuEntities.getTotalPages());
        // 总条数
        jsonPage.setTotal(spuEntities.getTotalElements());
        // 赋值数据
        jsonPage.setList(spuEntities.getContent());
        // 别忘了返回jsonPage
        return jsonPage;
    }

    @Override
    public void loadSpuByPage() {

    }
}

修改控制层代码

修改SearchController中的代码

@GetMapping
@ApiOperation("根据关键字查询ES中的信息")
@ApiImplicitParams({
        @ApiImplicitParam(value = "搜索关键字",name = "keyword",dataType = "string",
                                                required = true),
        @ApiImplicitParam(value = "页码",name = "page",dataType = "int",
                required = true),
        @ApiImplicitParam(value = "每页条数",name = "pageSize",dataType = "int",
                required = true)
})
//                        ↓↓↓↓↓↓↓↓↓↓↓
public JsonResult<JsonPage<SpuEntity>> searchByKeyword(
        String keyword,
        @RequestParam(value = "page",defaultValue = "1")Integer page,
        @RequestParam(value = "pageSize",defaultValue = "5") Integer pageSize
        ){
       //     ↓↓↓↓↓↓↓↓↓↓↓
   JsonPage<SpuEntity> list=searchService.search(keyword,page,pageSize);
    return JsonResult.ok(list);

}

如果测试包test中的类报错,把他们注释或删除即可

执行查询

leaf\product\[passport]\search

启动虚拟机

如果不能查询出数据库中正确的对应的信息

需要在数据库工具软件中运行下面代码

USE mall_pms;

UPDATE pms_spu SET gmt_modified=now() WHERE  1=1;

以激活logstash对spu表的监听,并向ES中保存数据

这个操作可能有些延迟,稍等即可

再次查询,就有能够正确搜索信息了!

Logstash下ES的运行流程

安装配置好相关软件后

logstash会自动监听指定的表(一般指定监听gmt_modified列)

当gmt_modified列值变化时,logstash就会收集变化的行的信息

周期性的向ES进行提交

ES中的数据就会自动和数据库中的变化同步了

这样,我们再程序中,就无需编写任何同步ES和数据库的代码

标签:ELK,17,查询,日志,数据,logstash,ES
来源: https://www.cnblogs.com/yzoran/p/16483899.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有