• MLK分布式日志处理


    目录

    场景以及优点

    Java代码集合logstash,es进行检索

    将信息通过logstash输入到es中

    然后我们将es中的日志信息输出(做一个日志的接口)


     

    场景以及优点

    当系统发现故障时,那么我们需要登录服务器grep 等脚本工具去日志查找原因,在没有日志系统的情况下,如果服务器部署了多个实例,我们需要进每个实例的容器种去寻找日志文件(如果量毕比较大的话,比如每天产生一个新的logfile,那么多节点时间一长就会导致文件过多)

    (50条消息) tail 命令详解_Coder杨公子的博客-CSDN博客_tail命令

    优化:

    我们可以将日志集中管理,并且提供集中检索的方法(ELK=elasticsearch+logstash+kibana),

    logstash:负责数据的收集整理,相当于一个通道

    Elasticsearch:数据的存储和分析

    在这里插入图片描述

     logstash的工作原理:

    logstash事件处理管道有三个阶段:1.输入->过滤器->输出,输入生成事件,然后过滤器去过滤修改他们将他们输出到其他地方

    在这里插入图片描述

     1.首先docker pull一共logstash的tar包,进行解压得到镜像

     2.然后修改配置文件

     3.最后重启容器即可

    Java代码集合logstash,es进行检索

    将信息通过logstash输入到es中

    1.logstash日志配置文件

    1. "1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    4. <springProperty scope="context" name="springAppName" source="spring.application.name" />
    5. <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}" />
    6. <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
    7. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    8. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    9. <level>INFOlevel>
    10. filter>
    11. <encoder>
    12. <pattern>${CONSOLE_LOG_PATTERN}pattern>
    13. <charset>utf8charset>
    14. encoder>
    15. appender>
    16. <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    17. <destination>82.157.198.247:4560destination>
    18. <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    19. appender>
    20. <root level="DEBUG">
    21. <appender-ref ref="console" />
    22. <appender-ref ref="logstash" />
    23. root>
    24. configuration>

    2.启动类上利用LoggerFactory打印日志 

    1. package com.wyh.logstash;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import org.springframework.boot.SpringApplication;
    5. import org.springframework.boot.autoconfigure.SpringBootApplication;
    6. @SpringBootApplication
    7. public class LogStashApplication {
    8. public static void main(String[] args) {
    9. Logger logger = LoggerFactory.getLogger(LogStashApplication.class);
    10. logger.error("自己写的bug");
    11. SpringApplication.run(LogStashApplication.class, args);
    12. }
    13. }

    3.logstash依赖

    1. <dependency>
    2. <groupId>net.logstash.logbackgroupId>
    3. <artifactId>logstash-logback-encoderartifactId>
    4. <version>6.3version>
    5. dependency>

    此时会发现日志通过logstash这通道输出到es中

    然后我们将es中的日志信息输出(做一个日志的接口)

    0.实体类

    1. package com.wyh.logstashsys.pojo;
    2. import lombok.Data;
    3. import org.springframework.data.annotation.Id;
    4. import org.springframework.data.elasticsearch.annotations.DateFormat;
    5. import org.springframework.data.elasticsearch.annotations.Document;
    6. import org.springframework.data.elasticsearch.annotations.Field;
    7. import org.springframework.data.elasticsearch.annotations.FieldType;
    8. import java.util.Date;
    9. @Data
    10. @Document(indexName = "test_log")
    11. public class LogPojo {
    12. @Id
    13. private String id;
    14. @Field(type = FieldType.Integer)
    15. private Integer port;
    16. @Field(type = FieldType.Text)
    17. private String message;
    18. @Field(name = "@version",type = FieldType.Keyword)
    19. private String version;
    20. //注意:如果不配置date_time
    21. @Field(name = "@timestamp",type = FieldType.Date,format = DateFormat.date_time)
    22. private Date timestamp;
    23. @Field(type = FieldType.Keyword)
    24. private String host;
    25. }

    1.接口

    1. public interface LogService {
    2. /**
    3. * 1.查询es中的日志信息
    4. * @return
    5. */
    6. List selectPage(Integer page,Integer rows);
    7. }

    2.业务实现类(指定时间范围得到hits,然后放到集合中进行返回)

    1. @Service
    2. public class LogServiceImpl implements LogService{
    3. @Autowired
    4. private ElasticsearchRestTemplate elasticsearchRestTemplate;
    5. /**
    6. * 1.分页查询es中的分布式日志
    7. * @param page
    8. * @param rows
    9. * @return
    10. */
    11. @Override
    12. public List selectPage(Integer page, Integer rows) {
    13. //1.设置查询参数:小于当前时间15分钟的时间对象
    14. Calendar calendar = Calendar.getInstance();
    15. calendar.add(Calendar.MINUTE,-15);
    16. //2.查询最近15分钟以内的日志
    17. Query query = new NativeSearchQuery(QueryBuilders.rangeQuery("@timestamp").gte(calendar.getTime()));
    18. query.setPageable(PageRequest.of(page-1,rows));
    19. //3.es客户端进行查询
    20. SearchHits searchHits = elasticsearchRestTemplate.search(query, LogPojo.class);
    21. //4.对结果进行循环遍历输出
    22. Vector vector = new Vector<>();
    23. for (SearchHit searchHit : searchHits) {
    24. vector.add(searchHit.getContent());
    25. }
    26. return vector;
    27. }
    28. }

     3.接口层

    1. /**
    2. * 1.得到分布式事务的分页结果
    3. * @param page
    4. * @param rows
    5. * @return
    6. */
    7. @RequestMapping("/")
    8. public List showLogs(Integer page,Integer rows){
    9. return logService.selectPage(page,rows);
    10. }

     

     

  • 相关阅读:
    elmentui表单重置及出现的问题
    mysql中的between边界问题
    干货!ASSANet:让PointNet++更快更强
    Three.js之顶点UV坐标、纹理贴图
    服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法
    互联网的起源与发展历程:从ARPANET到现代网络社会
    python实现根据词根词缀查询四级英语词汇
    vis 右键节点展开菜单
    P4 开发实践 — NG-SDN Tutorial — Exercise 2: Yang, OpenConfig, and gNMI basics
    存储过程、Statement详解
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/127589613