如何给SpringBoot自定义彩色Banner?

633 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路

下面这幅画,相信大家大家都不陌生.

   .   ____          _            __ _ _
  /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
 ( ( )___ | '_ | '_| | '_ / _` | \ \ \ \
  /  ___)| |_)| | | | | || (_| |  ) ) ) )
   '  |____| .__|_| |_|_| |___, | / / / /
  =========|_|==============|___/=/_/_/_/
  :: Spring Boot ::                (v2.4.6)

这是SpringBoot项目在启动时候在日志里输出的横幅(Banner)图.这种用普通字符组成图形的玩法, 叫ASCII艺术(ASCII ART),在网上能找到很多神作,可以去ASCII Art Archive 观摩一下.

自定义Banner

自己动手,在main/resources下新建一个banner.txt,里面放上喜欢的ASCII ART即可使用自己的banner. 比如这里换了一个公众号广告banner,启动就是这样了.

   ╔╗╔═══╗╔╗  ╔╗╔═══╗  ╔╗╔╗╔═╗╔╗
   ║║║╔═╗║║╚╗╔╝║║╔═╗║  ║║║║║╔╝║║
   ║║║║ ║║╚╗║║╔╝║║ ║║  ║║║╚╝╝ ║║
 ╔╗║║║╚═╝║ ║╚╝║ ║╚═╝║╔╗║║║╔╗║ ║║ ╔╗
 ║╚╝║║╔═╗║ ╚╗╔╝ ║╔═╗║║╚╝║║║║╚╗║╚═╝║
 ╚══╝╚╝ ╚╝  ╚╝  ╚╝ ╚╝╚══╝╚╝╚═╝╚═══╝
     欢迎光临公众号K字的研究(javajkl)
 2022-03-06 21:18:49.554  INFO 52372 --- [           main] sh.now.afk.springboot.SpringBootColor    : Starting SpringBootColor 

这里之所以改起来这么方便,简单, 因为SpringBoot这里使用了约定大于配置奥义.(咳咳, 说的好听是这么说,直白点就是默认值)

SpringBoot项目启动时候, 会调用SpringApplicationBannerPrintergetTextBanner来获取Banner.

     String location = environment.getProperty("spring.banner.location", "banner.txt");
  • 如果有spring.banner.location配置就用,不然就用默认的banner.txt
  • 要是读不到配置的banner,就用默认的banner

约定大于配置是种思想,思维方式, 实现起来,也就:默认值,默认值,默认值,在各种地方添加默认值.

只要默认值能够服务好80%的人,就能省去80%的人配置的时间.这是一种二八法则.一种产品设计上的优化,俗话叫Don't Let Me Think.

图片Banner

但是, 你知道吗? 这个Banner,还可以直接用图片,不一定非要自己去搞ASCII Art.

   static final String[] IMAGE_EXTENSION = { "gif", "jpg", "png" };

官方还会去查找这3个格式的banner文件,自动转成ASCII art来用.不过这个功能好像在SpringBoot 3里给去掉了, 就不提了.

Spring 彩色日志

不知道有没有人注意过, 输出到屏幕时候,SpringBoot的日志,有的时候是彩色的,有的时候是黑白的.

这里有个设置:spring.output.ansi.enabled,默认值是:detect.如果开启检测, 他会在输出的时候,检查console是否支持彩色模式.支持的话就是彩色的,不支持就是黑白的.

检测方法是挺气人的,有控制台,且不是windows:

 System.console() != null && !(OPERATING_SYSTEM_NAME.contains("win"))

在Intellij Idea这种IDE里跑的时候, 输出窗口的ConsoleJava拿不到,会导致第一句为false,然后就误以为不支持彩色模式了. IDE里的console是支持的,可以强行用配置打开.

 spring.output.ansi.enabled=always

Spring 彩色banner

前面我们已经提过怎么让SpringBoot打印自定义Banner, 也提过怎么打印彩色日志.

加上我们的一点点常识,Banner是一种日志,很容易知道,SpringBoot 是可以打印彩色Banner的.比如这样:

怎么来做到这件事呢,只要知道彩色日志究竟是怎么做的就可以了.接下来换个不支持彩色日志的Console,再来看这个banner的输出.

 •[91m  ╔╗╔═══╗╔╗  ╔╗╔═══╗  ╔╗╔╗╔═╗╔╗
 •[92m  ║║║╔═╗║║╚╗╔╝║║╔═╗║  ║║║║║╔╝║║
 •[93m  ║║║║ ║║╚╗║║╔╝║║ ║║  ║║║╚╝╝ ║║
 •[94m╔╗║║║╚═╝║ ║╚╝║ ║╚═╝║╔╗║║║╔╗║ ║║ ╔╗
 •[95m║╚╝║║╔═╗║ ╚╗╔╝ ║╔═╗║║╚╝║║║║╚╗║╚═╝║
 •[96m╚══╝╚╝ ╚╝  ╚╝  ╚╝ ╚╝╚══╝╚╝╚═╝╚═══╝
 •[90m    欢迎光临公众号K字的研究(javajkl) •[30m

yes, 他在正常的日志文本流里,加入了一些\033[91m的字样来提供颜色.

  • 其中\033是ESC
  • 后面的控制码

谜底就在谜面上, 这个是ansi标准,在配置的keyspring.output.ansi这里,就已经见过他了.

不过现在相信你有看明白了,彩色输出的Console日志多了很多字符,体积是偏大的,千万不要把这些东西给存到日志文件里去.

ANSI Color

这是个1979年的老东西了, 算是上古遗迹. 真想搞明白的话, 可以去ansicolor这里,或者掘金大佬写的通过Ansi Escape Codes酷炫玩转命令行!来学习一下.

如果说有需要在Java里使用的话, 也不用害怕和抓瞎.SpringBoot对Ansi提供了一套工具,可以自行去org.springframework.boot.ansi包下面来取用.别的不说, 这里的几个枚举,还是能拿来用用的.

后话

今天就玩儿到这里,相信已经有人迫不及待要开始去写自己的Banner了.要是写出什么好看的,请务必留言给我分享一波,谢谢大家.