使用SpringBoot Admin 进行日志的记录
一、SpringBoot Admin 简介
使用SpringBoot Admin进行日志的记录,可以很轻松的是实现对SpringBoot、SpringCloud项目运行状态的监控。Spring Boot Admin本身也是一个Web应用,每个Spring Boot应用程序都被视为客户端并注册到管理服务器。背后的数据采集是由Spring Boot Actuator端点提供。
启动时会自动加载actuator相关映射
二、使用 SpringBoot Admin
1.监控中心 admin
step1: 导入 spring-boot-admin-starter-server 监控依赖
step2: 启动类添加注解 @EnableAdminServer
step3:配置 yml 暴露端点和指定日志文件地址
# 监控服务名
spring:
application:
name: monitor-server
# 监控中心 端口
server:
port: 9009
# include 暴露端点 (不暴露时)
management:
endpoints:
web:
exposure:
include: "*"
# 注释后 不显示 logfile 模块
logfile:
external-file: E:/data/adminTest/logs/output.log #指向日志文件地址,需与LogBack配置的日志地址一致
# 在访问/actuator/health时显示完整信息
endpoint:
health:
show-details: always
2.服务 client
step1: 导入 spring-boot-admin-starter-client监控依赖
step2: 添加 logback-spring.xml 日志配置文件
step3:配置 yml 暴露端点和指定日志文件地址
3.启用和暴露端点
执行器端点使您可以监视应用程序并与之交互。Spring Boot包含许多内置端点,您可以添加自己的端点。例如,health端点提供基本的应用程序运行状况信息。
每个端点都可以启用或禁用。这控制了是否创建了端点以及它的bean在应用程序上下文中是否存在。为了可以远程访问,端点还必须通过JMX或HTTP公开。大多数应用程序选择HTTP,其中终结点的ID和前缀/actuator映射到URL。例如,默认情况下,health端点映射到/actuator/health。
端点列表:
ID | 描述 |
---|---|
auditevents | 公开当前应用程序的审核事件信息。需要一个AuditEventRepositoryBean。 |
beans | 显示应用程序中所有Spring Bean的完整列表。 |
caches | 公开可用的缓存。 |
conditions | 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 |
configprops | 显示所有的整理列表@ConfigurationProperties。 |
env | 公开Spring的属性ConfigurableEnvironment。 |
flyway | 显示已应用的所有Flyway数据库迁移。需要一个或多个FlywayBean。 |
health | 显示应用程序运行状况信息。 |
httptrace | 显示HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应交换)。需要一个HttpTraceRepositoryBean。 |
info | 显示任意应用程序信息。 |
integrationgraph | 显示Spring Integration图。需要对的依赖spring-integration-core。 |
loggers | 显示和修改应用程序中记录器的配置。 |
liquibase | 显示已应用的所有Liquibase数据库迁移。需要一个或多个LiquibaseBean。 |
metrics | 显示当前应用程序的“指标”信息。 |
mappings | 显示所有@RequestMapping路径的整理列表。 |
scheduledtasks | 显示应用程序中的计划任务。 |
sessions | 允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。 |
shutdown | 使应用程序正常关闭。默认禁用。 |
threaddump | 执行线程转储。 |
如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:
ID | 描述 |
---|---|
heapdump | 返回hprof堆转储文件。 |
jolokia | 通过HTTP公开JMX bean(当Jolokia在类路径上时,不适用于WebFlux)。需要对的依赖jolokia-core。 |
logfile | 返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性)。支持使用HTTP Range标头来检索部分日志文件的内容。 |
conditions | 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 |
prometheus | 以Prometheus服务器可以抓取的格式公开指标。需要对的依赖micrometer-registry-prometheus。 |
3.1 启用端点
默认情况下,除了shutdown端点是关闭的,其它的都是启用的。
management.endpoint.<id>.enabled
1)启用shutdown端点
management.endpoint.shutdown.enabled=true
2)关闭默认端点
management.endpoints.enabled-by-default=false
3)启用info端点
management.endpoint.info.enabled=true
- 禁用的端点将从应用程序上下文中完全删除。
- 如果只想更改公开端点的技术,请使用include和exclude属性。
3.2 暴露端点
停止公开所有在JMX上公开的端点,只公开info和health两个端点,使用如下属性:
management.endpoints.jmx.exposure.include=health,info
通过HTTP公开所有的端点,除了env和beans端点,使用如下的属性:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
[端点参考资料]:Spring Boot Actuator
三、源码
统一版本
依赖名 | 版本号 |
---|---|
SpringBoot | 2.0.2.RELEASE |
lombok | 1.18.8 |
admin-server | 2.0.2 |
admin-client | 2.0.2 |
1.监控 Module
1.1 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- admin-server -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
1.2 配置yml
# 监控服务名
spring:
application:
name: monitor-server
# 监控中心 端口
server:
port: 9009
# include 暴露端点 (不暴露时)
management:
endpoints:
web:
exposure:
include: "*"
# 注释后 不显示 logfile 模块
logfile:
external-file: E:/data/adminTest/logs/output.log #指向日志文件地址,需与LogBack配置的日志地址一致
# 在访问/actuator/health时显示完整信息
endpoint:
health:
show-details: always
1.3 启动器类
添加 @EnableAdminServer 注解
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableAdminServer
@SpringBootApplication
public class LakersApplication {
public static void main(String[] args) {
SpringApplication.run(LakersApplication.class, args);
}
}
2.服务 Module
2.1 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- admin-client -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
2.2 配置yml
# 服务名
spring:
application:
name: admin-client
# 指定admin监控中心地址
boot:
admin:
client:
url: http://localhost:9009
# 服务端口
server:
port: 9010
# 定义日志文件输出路径 [注释后 不显示 本服务的 logfile 模块]
logging:
file: E:/data/adminTest/logs/output.log
# include 暴露端点
management:
endpoints:
web:
exposure:
include: '*'
# 在访问/actuator/health时显示完整信息
endpoint:
health:
show-details: always
2.3 在application.yml平级文件夹中添加logback-spring.xml配置文件
该文件 引用自作者 kjf00
引用链接:https://blog.csdn.net/k849875005/article/details/97136450
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="APP_Name" value="adminTest"/>
<contextName>${APP_Name}</contextName>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径,请根据需求配置路径-->
<property name="LOG_HOME" value="E:/data/adminTest/logs"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="adminTest >> ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(LN:%L){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/output.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/output-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="WARN"/>
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="WARN"/>
<logger name="org.hibernate.SQL" level="WARN"/>
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="WARN"/>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="WARN"/>
<logger name="java.sql.Connection" level="WARN"/>
<logger name="java.sql.Statement" level="WARN"/>
<logger name="java.sql.PreparedStatement" level="WARN"/>
<logger name="org.apache.shiro" level="WARN"/>
<logger name="springfox.documentation" level="WARN"/>
<!-- 日志输出级别,注意:如果不写<appender-ref ref="FILE" /> ,将导致springboot Admin找不到文件,无法查看日志 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
2.4 Controller
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Slf4j
@RestController
public class ListenController {
// Test 测试 格式化日期
@RequestMapping(value = "/getTime",method = RequestMethod.GET)
public String getTime(){
Date date = new Date();
// SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
// DateTimeFormatter
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String localTime = dtf.format(localDateTime);
// TODO 解决slf4j中Logger.info 只打印出文字没有参数中的数据 -> 使用占位符 {}
log.info("记录当前时间:普通时间: {}, 本地时间: {}",time, localTime);
String t = "普通日期 通过 SimpleDateFormat 进行格式化 "+time+"<br>本地时间LocalDateTime 通过 DateTimeFormatter 进行格式化 "+localTime;
return t;
}
}
四、测试结果
1.不暴露端点 测试
# 未配置/注释 以下内容
management:
endpoints:
web:
exposure:
include: "*"
监控中心后台 除Detials外 所有功能失效
2.不配置 logfile 测试
2.1监控端未配置logfile -> 不显示 logfile 模块
management:
# 未配置/注释 以下内容
logfile:
# 指向日志文件地址,需与LogBack配置的日志地址一致
external-file: E:/data/adminTest/logs/output.log
2.2服务端未配置logging.file -> 显示红字提示 fetch logfile failed [请求logile 失败,状态码 404]
# 未配置/注释 以下内容
# 定义日志文件输出路径 [注释后 不显示 本服务的 logfile 模块]
logging:
file: E:/data/adminTest/logs/output.log
3.正常情况
控制台 打印的 项目前缀
访问 localhost[Ip地址]:端口号 即可
本案例中访问 http://localhost:9009 即可进入监控中心
logfile模块 查看日志详情