乐趣区

关于java:Spring-Cloud-分布式日志采集方案建议收藏

因为微服务架构中每个服务可能扩散在不同的服务器上,因而须要一套分布式日志的解决方案。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 的治理页面了。

举荐一个 Spring Boot 基础教程及实战示例:
https://github.com/javastacks…

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

在咱们的其余微服务端须要简略的配置,纳入到 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。

轻易调用一个微服务

而后咱们能够看到相干的跟踪日志

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

二、搭建 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

将 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.nam e 配置提到 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,轻易运行一个服务,比方

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

eclipse 控制台输入日志

在 kibana 中搜寻日志

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

零碎上线后只须要在 elasticsearch 中就能搜寻到各个服务器上,各个微服务的日志内容了。

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

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版