Spring Cloud 分布式日志采集方案,建议收藏!

点击上方“码农突围”,马上关注
这里是码农充电第一站,回复“666”,获取一份专属大礼包
真爱,请设置“星标”或点个“在看”

6f4b20c90f4917d10d8cc199e559d09f.png

由于微服务架构中每个服务可能分散在不同的服务器上,因此需要一套分布式日志的解决方案。

spring-cloud提供了一个用来trace服务的组件sleuth。它可以通过日志获得服务的依赖关系。基于sleuth,可以通过现有的日志工具实现分布式日志的采集。

这里使用的是ELK,也就是elasticsearch、logstash、kibana。

一、sleuth

第一步:sleuth管理端

sleuth一般单独放在一个工程中。需要添加如下依赖

<dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-server</artifactId>
    </dependency>

配置服务注册中心的地址

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

启动类加入服务发现的注解和zipkin的注解,如下

package com.wlf.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import zipkin.server.EnableZipkinServer;

@EnableDiscoveryClient
@EnableZipkinServer
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

这个时候启动并访问该微服务的地址,可以看到zipkin的管理页面了。

第二步:被管理的微服务端

在我们的其他微服务端需要简单的配置,纳入到zipkin的管理之中

引入依赖

<dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-sleuth</artifactId>
     </dependency>

     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-sleuth-zipkin</artifactId>
     </dependency>

加入如下配置

spring:
  sleuth:
    sampler:
       percentage: 1
  zipkin:
    base-url: http://localhost:9411

spring.sleuth.sampler.percentage:这个参数的意思是抓取100%的日志,只有通过抓取日志,才能获知依赖关系。但是如果始终抓取日志的话对性能会有影响,因此可以自己配置。一般在开发环境,该值设置为1,生产环境视情况而定。

spring.zipkin.base-url:为第一步配置的zipkin管理端微服务的地址

现在分别启动服务注册中心,网关,需要的微服务,以及sleuth。

随便调用一个微服务

a90b2b34fe7e7120b9c17a594cf21476.png
图片

然后我们可以看到相关的跟踪日志

8dc86a4129a7f3a17f0c183de39f736a.png
图片

同样我们也可以看到微服务之间的依赖关系,这里是通过网关调用了myservice-consumer-feign微服务,然后通过myservice-consumer-feign微服务调用了myservice-provider微服务

d972a082a7fd73b8ac11a66a6fb5e6b5.png
图片

二、搭建ELK

1、elasticsearch的安装与配置,由于之前的文章已经介绍了elasticsearch的单点,集群的安装,head插件的安装。这里不再总结。

2、kibana的安装,没什么好说的,解压,运行就可以了

3、logstash的安装,解压即可

在config下新建配置文件

output {
input {
  tcp {
      port => 4560
      codec => json_lines
  }
}

output {
  elasticsearch {
     hosts => ["192.168.160.66:9200","192.168.160.88:9200","192.168.160.166:9200"]
     index => "applog"
  }
}

其中port为端口号,codec表示通过json格式,elasticsearch.hosts表示elasticsearch的地址,这里是集群。index 为日志存储的elasticsearch索引。

启动需要调用bin下的logstash命令,通过-f指定配置文件

4、使用kibana

启动elasticsearch、head、kibana、logstash

创建索引applog

b17a3c3720aa4a4ac34339d2c1ec2158.png
图片

将applog配置到kibana中,在index pattern中输入我们的applog索引

93dd41b5047d43bb238d6e11d597eb59.png
图片
12891ef4cb1301314f00d78066efecbe.png
图片

最后点击create即可

点击菜单中的discover即可查看日志

31d43ff8aed792b38c7a70947be885a5.png
图片

三、logback配置

spring-cloud、logstash都是支持logback的,因此需要为微服务配置好相应的logback-spring.xml

这里值得注意的是,在spring-boot中,logback-spring.xml的加载在application.yml之前。而我们需要在logback-spring.xml中使用spring.application.name

因此,我们需要把spring.application.name配置提到bootstrap.yml中。

加载顺序为bootstrap.yml,logback-spring.xml,application.yml

相比普通的logback-spring.xml,我们主要配置这几样东西spring.application.name,logstash的appender

这里提供一个logback-spring.xml的例子

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">

    <springProperty scope="context" name="springAppName"
        source="spring.application.name" />

    <property name="CONSOLE_LOG_PATTERN"
              value="%date [%thread] %-5level %logger{36} - %msg%n" />

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
     <withJansi>true</withJansi>
  <encoder>
           <pattern>${CONSOLE_LOG_PATTERN}</pattern>
     <charset>utf8</charset>
     </encoder>
    </appender>

    <appender name="logstash"
     class="net.logstash.logback.appender.LogstashTcpSocketAppender">
     <destination>192.168.160.66:4560</destination>
     <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
      <providers>
       <timestamp>
        <timeZone>UTC</timeZone>
       </timestamp>
       <pattern>
        <pattern>
         {
           "severity":"%level",
           "service": "${springAppName:-}",
                          "trace": "%X{X-B3-TraceId:-}",
                          "span": "%X{X-B3-SpanId:-}",
                          "exportable": "%X{X-Span-Export:-}",
                          "pid": "${PID:-}",
                          "thread": "%thread",
                          "class": "%logger{40}",
                          "rest": "%message"
         }
        </pattern>
       </pattern>
      </providers>
     </encoder>
    </appender>

    <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <File>main.log</File>
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     <FileNamePattern>main.%d{yyyy-MM-dd}.log</FileNamePattern>
     <maxHistory>30</maxHistory>
   </rollingPolicy>
   <encoder>
     <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
   </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
     <level>DEBUG</level>
   </filter>
 </appender>

    <springProfile name="!production">
        <logger name="com.myfee" level="DEBUG" />
        <logger name="org.springframework.web" level="INFO"/>
        <root level="info">
         <appender-ref ref="stdout" />
         <appender-ref ref="dailyRollingFileAppender" />
         <appender-ref ref="logstash" />
     </root>
    </springProfile>

    <springProfile name="production">
  <logger name="com.myfee" level="DEBUG" />
        <logger name="org.springframework.web" level="INFO"/>
        <root level="info">
         <appender-ref ref="stdout" />
         <appender-ref ref="dailyRollingFileAppender" />
         <appender-ref ref="logstash" />
     </root>
 </springProfile>
</configuration>

我们把message信息配置到了rest字段中。

三、查询日志

启动服务注册中心,网关,需要的微服务,以及sleuth。

启动elasticsearch,head,kibana,logstash,随便运行一个服务,比如

e51dead84b04556406646c3bacb36f17.png
图片

这里会输出一行日志,内容为myService-provider userController,通过网关调用

3ad7be42c575eac9e5f8adb824034e65.png
图片

eclipse控制台输出日志

705a2083eadd4e8777298813f3dc46a4.png
图片

在kibana中搜索日志

efe7756b1e4b34cad177b779326455c0.png
图片

我们看到日志信息在rest字段中。另外,通过trace和span还可以跟踪到整个微服务的调用过程。到此为止,整个日志采集就搭建完成了。

系统上线后只需要在elasticsearch中就能搜索到各个服务器上,各个微服务的日志内容了。

版权声明:本文为CSDN博主「guduyishuai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/guduyishuai/article/details/79228306

 
 
 
 
(完)
码农突围资料链接1、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF

欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringCloud是一款用于构建微服务架构的开源框架,它提供了一整套完善的组件,帮助开发者快速搭建和管理分布式系统中的服务。海康威视作为全球领先的视频监控产品和解决方案提供商,也提供了一系列的软件开发工具包(SDK),以便开发者能够快速集成海康威视的产品和技术。 要在SpringCloud中集成海康SDK,首先需要将SDK下载下来,并按照海康提供的文档进行安装和配置。然后,可以将SDK集成到SpringCloud微服务架构中的一个或多个服务中,以便实现视频监控、智能分析、云存储等功能。 在集成SDK的过程中,需要注意一些事项: 1. 确保SDK版本和SpringCloud版本兼容,避免出现不兼容的问题。 2. 需要根据实际需求选择SDK中的功能模块进行集成,避免浪费资源和影响系统性能。 3. 在集成过程中,要充分测试SDK的功能和性能,以确保其稳定性和可靠性。 总之,将海康SDK集成到SpringCloud微服务架构中,能够为用户提供更加方便、高效、可靠和安全的视频监控和智能分析服务,符合当前互联网和物联网发展的趋势。 ### 回答2: SpringCloud是一个优秀的微服务框架,可以帮助开发者实现快速构建和部署应用程序的目的,同时海康SDK是一个专业的视频监控设备开发平台,也是全球领先的监控产品厂家之一。把这两个东西结合在一起,可以在各个应用场景中广泛应用,比如智能家居、智能交通、智慧城市等领域。 要实现SpringCloud集成海康SDK,首先需要在SpringCloud中构建一个视频监控模块,该模块会调用海康SDK提供的API来获取视频监控设备的状态,并将数据存储到数据库中,以供后续使用。在具体操作中,需要遵循以下步骤: 1.在SpringCloud项目中引入海康SDK相关的依赖库。 2.编写视频监控模块,可以使用SpringCloud提供的Maven构建工具,主要包括视频设备API接口、视频设备状态管理等。同时,需要同时编写海康SDK相关的API接口,这样才能获取到视频设备的相关信息。 3.在SpringCloud项目中创建数据库表,以存储海康SDK获取的视频监控设备状态信息。 4.通过SpringCloud的服务发现机制,将视频监控模块注册到服务中心中,以便其他模块能够方便地调用。 5.实现监控设备状态的查询、设备状态的修改、设备状态的删除等功能,同时也要兼容其他服务模块,比如权限管理模块、用户管理模块等。 6.最后需要进行测试和部署,以验证该视频监控模块的功能是否正常,是否符合预期。可以使用Postman等API测试工具对接口进行测试,也可以使用Docker等容器技术进行部署。 总之,SpringCloud集成海康SDK是一个非常有技术挑战的过程,需要我们熟练掌握SpringCloud框架和海康SDK的技术架构,同时也需要对视频监控设备相关的知识有一定的了解。但只要我们充分发挥自己的技术能力,积极学习和实践,就一定能够成功地实现SpringCloud集成海康SDK这一复杂的技术需求。 ### 回答3: Spring Cloud是一个基于Spring Framework的云原生应用开发框架,它可以帮助开发者更加轻松地构建、部署和管理应用程序。海康SDK是一个视频监控系统的开发工具包,通过海康SDK,可以轻松实现视频流的采集、存储、回放等功能。那么如何将这两个东西结合起来呢? 首先,需要在Spring Cloud项目中引入海康SDK的相关依赖,可以通过Maven或Gradle进行引入。接着,需要编写相关的Java代码来与海康SDK进行交互,例如进行摄像头的初始化、视频流的采集等操作。在编写代码时,需要注意以下几点: 1. 需要根据不同的海康SDK版本进行相应的引用和调用; 2. 需要由专门的海康SDK开发人员来对接海康SDK,以保证代码的可用性和稳定性; 3. 需要加强对海康SDK的异常处理和错误处理,以避免出现不必要的问题和风险。 在集成了海康SDK之后,可以通过Spring Cloud的服务治理、负载均衡等功能来实现对海康SDK的资源调度和管理。同时,也可以结合Spring Cloud的监控、日志、容错等功能,对视频监控系统进行更加全面和细致的管理和控制。 总体来说,Spring Cloud集成海康SDK可以帮助开发者快速构建稳定、高效和安全的视频监控系统,实现更好的视频监控体验和用户体验。但是需要注意的是,集成海康SDK需要有专业的技术支持和开发经验,以保证系统的稳定性和正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值