背景:因为服务容器化部署在了k8s集群,像往常一样把日志写入到服务器的文件系统中已经不那么适用了。一旦重新部署又是另外一个容器会导致日志丢失,虽然理论上来说也可以使用文件挂载的方式,但是相比而言集成elk会更加好用点。而sleuth的主要作用就是在请求过程中加上traceid和spanid来标记微服务间调用的同一个请求。

这两个字段在日志格式中的配置分别为:%X{X-B3-TraceId:-}%X{X-B3-SpanId:-}
对应的maven依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
        
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>

logback.xml的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--定义Logstash输出器-->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
           
        </encoder>
    </appender>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{X-B3-TraceId},%X{X-B3-SpanId}] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--设置根日志级别为INFO,将日志事件输出到Logstash输出器中-->
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="console"/>
    </root>

</configuration>

这一步的前提是,我们已经搭建好了自己的ELK,或者是logstash服务,因为最终是输出到logstash的。然后是替换掉logback.xml的destination配置,替换成实际的logstash的服务地址。

如果需要搭建ELK,可以移步小弟的另一篇博客使用rancher管理界面在k8s集群搭建ELk

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐