Spring Boot 自定义Logo 以及控制台打印启动地址
1. 自定义Logo
原理: Spring Boot 的一个内置特性,用于在应用程序启动时显示一个“横幅”(banner)。
自动检测banner.txt
:
- 当 Spring Boot 应用程序启动时,它会自动在类路径(classpath)的根目录下查找名为
banner.txt
的文件。在 Maven/Gradle 项目中,src/main/resources
目录下的内容会被复制到类路径的根目录。 - 如果找到了
banner.txt
文件,Spring Boot 会读取其内容并在应用程序启动日志的最开始(或非常靠前的位置)将其打印到控制台。
简单来说,只要 Spring Boot 应用启动时能在类路径的根目录找到一个名为 banner.txt
的文件,它就会默认打印出来。
目的:这个 banner 通常用来显示应用程序的名称、版本号、ASCII 艺术的 Logo,或者任何开发者想在启动时展示的欢迎信息。
1.1 默认的Spring Logo
Spring Boot 在启动时会显示一个 ASCII 艺术的 LOGO(默认为 Spring 的标志)。
我们也可以自定义,就是替换 banner.txt
文件(放置自定义的 ASCII 图案)
1.2 如何自定义Logo
1.2.1 创建自定义banner.txt 文件
在项目 <src/main/resources
目录下创建或替换 banner.txt
文件
1.2.2 配置
spring.banner.location
:指定Logo文件的路径,默认为classpath:banner.txt
。所以如果路径和文件名跟默认一样,可不配置。
spring.banner.charset
:字符编码,默认为 UTF-8
。可不配置
spring.main.banner-mode
:显示方式,默认为 console
(控制台输出)。
可选值:
console
:在控制台输出(默认)。
log
:以日志形式输出(日志级别为 INFO)。
off
:禁用商标显示。
1.2.3 如何编辑制作Logo
在线生成工具:https://tool.cccyun.cc/ascii_art
颜色支持:通过 ANSI 转义码添加颜色
一些额外信息:
- 优先级:如果使用您的 starter 的主应用程序也在其自己的
src/main/resources
目录下放了一个<banner.txt
,那么主应用程序的banner.txt
通常会覆盖(或优先于)您 starter JAR 中提供的banner.txt
。Spring Boot 只会打印一个 banner.txt 的内容。
2. 控制台打印启动地址
项目结构
2.1 启动类中写
@SpringBootApplication
public class Application {
private static Logger log = LoggerFactory.getLogger(Application.class);
public static void main( String[] args ) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
Environment env = applicationContext.getEnvironment();
boolean shouldPrintStartupInfo = env.getProperty("banner.app-startup-enabled", Boolean.class, true);
if (shouldPrintStartupInfo) {
logAppStartUp(env);
}
}
/**
* 打印启动地址
*/
private static void logAppStartUp(Environment env) {
String appName = Optional.ofNullable(env.getProperty("spring.application.name"))
.orElseGet(() -> Optional.ofNullable(env.getProperty("application.name")).orElse(""));
String protocol = Optional.ofNullable(env.getProperty("server.ssl.key-store"))
.map(key -> "https")
.orElse("http");
String port = Optional.ofNullable(env.getProperty("server.port")).orElse("8080");
String contextPath = Optional.ofNullable(env.getProperty("server.servlet.context-path"))
.filter(StringUtils::hasText)
.orElse("/");
String hostIp = "localhost";
try {
hostIp = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
log.warn("Failed to get host address, using 'localhost' as default.", e);
}
String docFileName = "doc.html";
String fullDocPath;
if ("/".equals(contextPath)) {
fullDocPath = "/" + docFileName;
} else if (contextPath.endsWith("/")) {
fullDocPath = contextPath + docFileName;
} else {
fullDocPath = contextPath + "/" + docFileName;
}
String[] activeProfiles = env.getActiveProfiles();
String[] profilesToLog = activeProfiles.length == 0 ? env.getDefaultProfiles() : activeProfiles;
log.info(
"""
----------------------------------------------------------
Application {} is running! Access URLs:
url: {}://{}:{}{}
docs: {}://{}:{}{}
Profile(s): {}
----------------------------------------------------------""",
appName, // name
protocol, hostIp, port, contextPath, // uRL parts
protocol, hostIp, port, fullDocPath, // docs URL parts
Arrays.toString(profilesToLog) // profiles
);
}
}
2.2 配置类写
public class BannerApplicationRunner implements ApplicationRunner {
Logger log = LoggerFactory.getLogger(this.getClass());
private final Environment env;
public BannerApplicationRunner(Environment env) {
this.env = env;
}
@Override
public void run(ApplicationArguments args) {
String appName = Optional.ofNullable(env.getProperty("spring.application.name"))
.orElseGet(() -> Optional.ofNullable(env.getProperty("application.name")).orElse(""));
String protocol = Optional.ofNullable(env.getProperty("server.ssl.key-store"))
.map(key -> "https")
.orElse("http");
String port = Optional.ofNullable(env.getProperty("server.port")).orElse("8080");
String contextPath = Optional.ofNullable(env.getProperty("server.servlet.context-path"))
.filter(StringUtils::hasText)
.orElse("/");
String hostIp = "localhost";
try {
hostIp = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
log.warn("Failed to get host address, using 'localhost' as default.", e);
}
String docFileName = "doc.html";
String fullDocPath;
if ("/".equals(contextPath)) {
fullDocPath = "/" + docFileName;
} else if (contextPath.endsWith("/")) {
fullDocPath = contextPath + docFileName;
} else {
fullDocPath = contextPath + "/" + docFileName;
}
String[] activeProfiles = env.getActiveProfiles();
String[] profilesToLog = activeProfiles.length == 0 ? env.getDefaultProfiles() : activeProfiles;
log.info(
"""
----------------------------------------------------------
Application {} is running! Access URLs:
url: {}://{}:{}{}
docs: {}://{}:{}{}
Profile(s): {}
----------------------------------------------------------""",
appName, // name
protocol, hostIp, port, contextPath, // uRL parts
protocol, hostIp, port, fullDocPath, // docs URL parts
Arrays.toString(profilesToLog) // profiles
);
}
}
@Configuration
@ConditionalOnProperty(prefix = "banner-inner", name = "enabled", havingValue = "true", matchIfMissing = false)
public class BannerAutoConfiguration {
private final Environment env;
public BannerAutoConfiguration(Environment env) {
this.env = env;
}
@Bean
@Order()
public BannerApplicationRunner bannerApplicationRunner() {
return new BannerApplicationRunner(env);
}
}
2.3 starter依赖写
项目结构如下,写法还是用配置类的方式。然后用maven install一下。
然后在springboot-banner工程maven中引入一下
springboot-banner的配置文件可以控制banner开关
我的仓库地址:https://gitee.com/xiaoxingOvO/technical-learn.git