前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SpringCloud 分布式日志采集方案,你知道哪些?

SpringCloud 分布式日志采集方案,你知道哪些?

作者头像
搜云库技术团队
发布于 2022-04-08 08:43:11
发布于 2022-04-08 08:43:11
39000
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是磊哥。

由于微服务架构中每个服务可能分散在不同的服务器上,因此需要一套分布式日志的解决方案。spring-cloud提供了一个用来trace服务的组件sleuth。它可以通过日志获得服务的依赖关系。基于sleuth,可以通过现有的日志工具实现分布式日志的采集。

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

一、sleuth

第一步:sleuth管理端

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>  

配置服务注册中心的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eureka: 
  client: 
    serviceUrl: 
      defaultZone: http://localhost:1111/eureka/

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的管理之中

引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

加入如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring: 
  sleuth: 
    sampler: 
       percentage: 1
  zipkin: 
    base-url: http://localhost:9411

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

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

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

随便调用一个微服务

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

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

二、搭建ELK

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

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

3、logstash的安装,解压即可

在config下新建配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

最后点击create即可

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

三、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的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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,随便运行一个服务,比如

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

eclipse控制台输出日志

在kibana中搜索日志

我们看到日志信息在rest字段中。另外,通过trace和span还可以跟踪到整个微服务的调用过程。到此为止,整个日志采集就搭建完成了。系统上线后只需要在elasticsearch中就能搜索到各个服务器上,各个微服务的日志内容了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springcloud集成elk
springcloud是一个应用很广的微服务全家桶,阿里开发了自己的springcloud alibaba分支,elk是一款不错的监控工具,尤其是日志分析,可以将springcloud微服务项目的日志通过logstash-logback-encoder传送到elk的logstash上,好了废话不多少了,直接进入环境搭建流程:
johnhuster的分享
2022/03/29
6730
springcloud集成elk
Springboot项目搭配ELK日志平台
上一篇讲过了elasticsearch和kibana的可视化组合查询,这一篇就来看看大名鼎鼎的ELK日志平台是如何搞定的。
天涯泪小武
2019/01/17
1.4K0
手把手教你搭建ELK
假如我订单服务总共部署在20台服务器上,如果我们直接登录服务器查询日志的话,那得先看一号机器,没有再看二号机器……并且日志量较多的话,可能一个时间段内日志就被切分成好几个文件,这样查询实在是太麻烦了,ELK就是解决这个问题的。
贪挽懒月
2022/12/02
1.3K0
Spring boot with ELK(Elasticsearch + Logstash + Kibana)
本文节选自《Netkiller Java 手札》 5.31. Spring boot with ELK(Elasticsearch + Logstash + Kibana) 将 Spring boot 日志写入 ELK 有多种实现方式,这里仅提供三种方案: Spring boot -> logback -> Tcp/IP -> logstash -> elasticsearch 这种方式实现非常方便不需要而外包或者软件 Spring boot -> logback -> Redis -> logstash
netkiller old
2018/03/06
2.1K0
ELK实战(Springboot日志输出查找)
需求 把分布式系统,集群日志集中处理快速查询 搭建ELK并与springboot日志输出结合 搭建ELK 基于我前面的elasticsearch搭建博客文档docker-compose.yml基础上进行添加修改 新建docker-compose.yml文件,内容如下 version: '2' services: elasticsearch-central: image: elasticsearch:5.6.4 container_name: es1 volumes:
老梁
2019/09/10
1.8K0
ELK实战(Springboot日志输出查找)
Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
通过之前的《入门示例》,我们已经为两个由SpringCloud构建的微服务项目 trace-1和 trace-2引入了Spring Cloud Sleuth的基础模块 spring-cloud-starter-sleuth,实现了为各微服务的日志信息中添加跟踪信息的功能。但是,由于日志文件都离散的存储在各个服务实例的文件系统之上,仅仅通过查看日志文件来分析我们的请求链路依然是一件相当麻烦的差事,所以我们还需要一些工具来帮助我们集中的收集、存储和搜索这些跟踪信息。引入基于日志的分析系统是一个不错的选择,比如:
程序猿DD
2018/03/20
1.4K0
Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
Spring Cloud 微服务(七)- 上:日志收集集成
每次看日志信息都需要登陆到远程服务器,会很麻烦,而且不同应用的日志需要切换到不同的日志文件,有时候还要联合多个日志文件查看请求涉及的所有信息。总结下来主要有 3 点问题:
安宁
2020/07/24
2.7K0
基于ELK收集业务日志的初步体验
elasticsearch - 7.5.1 logstash - 7.5.1 kibana - 7.5.1 logback.properties # 应用名称 appName=data-center
用户1215919
2021/12/28
3320
基于ELK收集业务日志的初步体验
SpringCloud——Sleuth、ELK、Zipkin
【解释】INFO [simple-demo-2,ddfe378c0a8ec7cc,d4f2e63ad9bc890b,true]
爪哇缪斯
2023/05/10
8650
SpringCloud——Sleuth、ELK、Zipkin
Java 项目日志:从Logback到SLF4J,再到链路跟踪配置详解
Java 应用开发运维中,日志记录重要。本文探讨 Logback 与 SLF4J 使用方式,介绍如何实现链路跟踪功能,提升系统监控和问题排查能力。
Yeats_Liao
2025/01/07
3880
Java 项目日志:从Logback到SLF4J,再到链路跟踪配置详解
项目实战|史上最简单的springboot 整合elk教程,实现日志收集
总有测试小姐姐教你紧急刹车,回头做(改)人(bug):AI大师,你这不行啊!(吃瓜群众排排坐,笑歪了嘴)
AI码师
2021/01/27
3.7K0
项目实战|史上最简单的springboot 整合elk教程,实现日志收集
Spring Cloud Sleuth使用ELK收集&分析日志
注意, logstash-logback-encoder 的版本务必和Logback兼容,否则会导致应用启动不起来,而且不会打印任何日志!可前往 https://github.com/logstash/logstash-logback-encoder 查看和Logback的兼容性。
用户1516716
2019/09/02
1.8K0
Spring Cloud Sleuth使用ELK收集&分析日志
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
Spring Boot默认使用SLF4J作为日志门面,并集成了Logback作为日志实现。SLF4J(Simple Logging Facade for Java)是一个通用的日志抽象层,可以与多种日志框架结合使用,如Logback、Log4j、Java Util Logging(JUL)等。Logback是一个快速、灵活且功能强大的日志框架,是Log4j的继任者。
IT_陈寒
2024/05/24
8190
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
SpringCloud学习5-如何创建一个服务提供者provider
前几篇主要集中在注册中心eureka的使用上,接下来可以创建服务提供者provider来注册到eureka。 demo源码见: https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/provider-demo 为了方便版本控制,接下来的项目都是基于https://github.com/Ryan-Miao/spring-cloud-Edgware-demo 这个parent配置的。 创建子moudle provider-demo
Ryan-Miao
2018/07/04
5120
如何监视所有 Spring Boot 微服务?
Spring Boot Actuator 是一个非常强大的工具,可以提供生产就绪的特性,如健康检查、度量指标、审计等。
代码小李
2025/02/02
610
分布式日志系统:Plumelog部署及系统接入
第一步:安装 redis 或者 kafka(一般公司redis足够) redis 官网:https://redis.io kafka:http://kafka.apache.org
Freedom123
2024/03/29
1.3K0
分布式日志系统:Plumelog部署及系统接入
SpringBoot应用整合ELK实现日志收集
搭建了ELK日志收集系统之后,我们如果要查看SpringBoot应用的日志信息,就不需要查看日志文件了,直接在Kibana中查看即可。
macrozheng
2019/07/22
2.3K0
SpringBoot应用整合ELK实现日志收集
SpringBoot集成ELK实现日志收集实践
Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存:
gang_luo
2020/08/17
1.3K0
Spring Boot 整合 elk
进入容器后,修改 /etc/logstash/conf.d/02-beats-input.conf
程序员果果
2019/05/16
8640
Spring Boot ELK 整体介绍 及使用
1. ELK应用场景 在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制。无论是开发人员还是运维人员都无法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。因此需要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展示,处理分析。 因此:ELK提供一套开源的解决方案,能高效、简便的满足以上场景。
Freedom123
2024/03/29
1480
Spring Boot ELK 整体介绍 及使用
推荐阅读
相关推荐
springcloud集成elk
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验