日志收集(ElasticSearch)串联查询 MDC

简介:   之前写过将应用程序或服务程序产生的日志直接写入搜索引擎的博客 其中基本过程就是  app->redis->logstash->elasticsearch 整个链路过程  本来想将redis替换成kafka的 无奈公司领导不让(不要问我为什么没有原因不想回答,哦也!就这么酷!!!)  然后又写了...

  之前写过将应用程序或服务程序产生的日志直接写入搜索引擎的博客 其中基本过程就是  app->redis->logstash->elasticsearch 整个链路过程  本来想将redis替换成kafka的 无奈公司领导不让(不要问我为什么没有原因不想回答,哦也!就这么酷!!!)

  然后又写了相关的优化,其实道理很简单 就是 部署多个redis 多个logstash就ok了 (注意redis建议不要部署集群单节点就OK因为他只承担了消息传输的功能别无其他,架集群的好处就是APP应用自己分发负载了,如果是多个redis单节点需要个类似nginx的东西做负载转发,其实最好使用F5这类的硬件会更好)好了不多说废话下面直奔主题。

  遇到的问题

    1、去ES(ElasticSearch 以下简称ES)查询日志用关键字搜索要搜索好几次才能定位的问题?

    2、多线程调用公用的方法很多时候是不是有点迷糊找不着北等等 不止这些

  想要达到的目的

    通过关键字(关键字可以是订单号,操作码等可以标识一条信息,一般在数据库里面都是主键)一次查询出来所有的整个链路的相关日志

  好,我们的目的很明确,不想各种过滤条件一大堆去定位真正想要的日志,一个关键搞定多所有。

  说道这里可能有很多童鞋对日志框架比较了解第一就会想到MDC,没错就是他。下面才是真正的主题,哈哈!

  MDC我就不多介绍这里我在网上随便找了一个介绍的 如果熟悉可以略过(https://blog.csdn.net/liubo2012/article/details/46337063)

  MDC其实就是在方法里面前后标记一下,然后在这个标记范围内(包括中间调用的方法嵌套)所有的日志都会打上相应的标签记录方便查询

  那怎么和我们之前的 方案结合和 我们之前用的是下面这个包,这个包是支持MDC传输的具体源码大家可以参看github实现https://github.com/kmtong/logback-redis-appender

  

<dependency>
            <groupId>com.cwbase</groupId>
            <artifactId>logback-redis-appender</artifactId>
            <version>1.1.5</version>
        </dependency>

当我们引入这个包之后logback.xml文件是如下配置的

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <!-- <jmxConfigurator/> -->
    <contextName>logback</contextName>

    <property name="log.path" value="\logs\logback.log" />

    <property name="log.pattern"
        value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID} --- traceId:[%X{mdc_trace_id}] [%15.15t] %-40.40logger{39} : %m%n" />

    <appender name="file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>

        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>info-%d{yyyy-MM-dd}-%i.log
            </fileNamePattern>

            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>10</maxHistory>
        </rollingPolicy>

    </appender>

    <appender name="redis" class="com.cwbase.logback.RedisAppender">

        <tags>test</tags>
        <host>10.10.12.21</host>
        <port>6379</port>
        <key>spp</key>
        <mdc>true</mdc>
        <callerStackIndex>0</callerStackIndex>
        <location>true</location>
        
        <!-- <additionalField>
            <key>traceId</key>
            <value>@{destination}</value>
        </additionalField> -->
    </appender>
    
    <root level="info">
        <!-- <appender-ref ref="file" /> -->
        <!-- <appender-ref ref="UdpSocket" /> -->
        <!-- <appender-ref ref="TcpSocket" /> -->
        <appender-ref ref="redis" />
    </root>

    <!-- <logger name="com.example.logback" level="warn" /> -->

</configuration>

我们把<mdc>true</mdc>标签设置为true 默认是false就可以了,下面我们看下我们的测试代码

package com.zjs.canal.client.client;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class testaa {
    protected final static Logger logger = LoggerFactory.getLogger(testaa.class);

    
    @Test
    public void test(){
        
        MDC.put("destination", "123456789");
        for (int i = 0; i < 10; i++) {
            logger.info("aaaaaaaa"+i);
            test1();
        }
        MDC.remove("destination");
    }
    public void test1()
    {
        for (int i = 0; i < 10; i++) {
            logger.info("bbbbbbbb"+i);
        }
    }
}

上面的测试有两层嵌套下面是ES日志输出

大家可以看到日志输出内容包含了两个方法,都包含相应的properties.destination字段并且值也是一样的(当然真正使用的时候destination MDC的关键字是动态的,选查询的主要关键字)

这样通过关键字一下就能把所有相关的日志都查询出来就能看出数据整个处理流程,这样就非常方便我们的查询定位排查问题

我上面的代码有一段注释不知道大家有没有注意到

就是下面这段

   <!-- <additionalField>
            <key>traceId</key>
            <value>@{destination}</value>
        </additionalField> -->                

其实我们把<mdc>true</mdc>这句设为false也是可以了不过需要添加一个字段来引用数据(把上面的配置取消注释)这样我们就可以自定义命名跟踪字段的名称了(本人更倾向使用这种)

然后配置就办成下面这样

    <appender name="redis" class="com.cwbase.logback.RedisAppender">

        <tags>test</tags>
        <host>10.10.12.21</host>
        <port>6379</port>
        <key>spp</key>
        <!-- <mdc>true</mdc> -->
        <callerStackIndex>0</callerStackIndex>
        <location>true</location>
        
         <additionalField>
            <key>traceId</key>
            <value>@{destination}</value>
        </additionalField>
    </appender>

然后看下效果

这是之前的默认字段就没有值了mdc引用的值变成我们新的字段里面去了

其实都可以开启 但是会打印两份MDC和自定义字段,这样就会重复了,所以说没必要了

好了 今天就说的这里希望对看博客的你有所帮助

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
7月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
7月前
|
JSON 监控 Java
日志与追踪的完美融合:OpenTelemetry MDC 实践指南
日志与追踪的完美融合:OpenTelemetry MDC 实践指南
569 24
|
7月前
|
自然语言处理 监控 安全
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
阿里云可观测官方发布了Observable MCP Server,提供了一系列访问阿里云可观测各产品的工具能力,包含阿里云日志服务SLS、阿里云应用实时监控服务ARMS等,支持用户通过自然语言形式查询
933 0
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
|
9月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
477 20
|
11月前
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
614 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
9月前
|
SQL 存储 自然语言处理
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
194 1
|
11月前
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
476 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
|
10月前
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
546 0
|
存储 SQL 监控
|
自然语言处理 监控 数据可视化