当前位置: 首页 > 科技观察

SpringBoot2.x的默认日志管理和Logback配置详解

时间:2023-03-13 07:27:33 科技观察

SpringBoot在所有内部日志中使用CommonsLogging,但是底层日志的实现是开放的。在SpringBoot生态中,为JavaUtilLogging、Log4J2、Logback等常用日志框架提供了自动配置组件。每个Logger都可以配置为在控制台或文件中输出日志内容。默认情况下,我们在使用各种Starters时,都会使用Logback来实现日志管理。如何写日志介绍中写日志的方式有很多种,这里就不一一列举了,只说DD用的最多的方式!首先,在代码层面,我们先不纠结是使用默认的Logback还是Log4j,而是直接使用:Slf4j。为什么不用Logback或Log4j就可以写代码?这就是使用Slf4j的好处!那么什么是Slf4j?英文全称:SimpleLoggingFacadeforJava,即:简单的日志门面,它并不是一个具体的日志解决方案,实际工作仍然是Logback或Log4j等日志框架。Slf4j是23种设计模式中门面模式的典型应用案例。通过Slf4j这样的facade的抽象,我们在写代码和记录日志的时候只依赖这个抽象操作,具体的实现会在Slf4jfacadeDelegate到具体实现日志的框架时调用。例如:下面是一个使用Slf4j记录日志的简单例子:@Slf4j@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);log.error("HelloWorld");log.warn("HelloWorld");log.info("HelloWorld");log.debug("HelloWorld");log.trace("HelloWorld");}}注意:这里我们在pom.xml中引入了Lombok,然后使用@Slf4j语句引入Slf4j的log日志记录对象,然后就可以很方便的使用它进行日志记录了。而这个日志如何写到控制台或文件中,取决于SpringBoot项目中引入的具体日志框架。默认情况下,它是Logback。日志元素启动任意一个SpringBoot项目,我们可以在控制台看到很多日志信息,比如下面的日志:日志的输出内容有7个元素,分别是:Timeanddate:精确到毫秒的日志level:ERROR,WARN,INFO,DEBUGorTRACEProcessIDDelimiter:---标识实际日志的起始线程名:括在方括号中(控制台输出可能被截断)Loggername:通常使用类名源代码日志内容日志输出在SpringBoot应用中,日志默认会输出到控制台。默认输出日志级别包括:ERROR、WARN和INFO。我们可以帮助上面编写的HelloWorld示例运行以验证此类默认设置。:2021-12-2817:37:25.578INFO65136---[main]com.didispace.chapter81.Application:StartedApplicationin2.695seconds(JVMrunningfor3.957)2021-12-2817:37:25.579ERROR65136---[main]com.didispace.chapter81.Application:HelloWorld2021-12-2817:37:25.579WARN65136---[main]com.didispace.chapter81.Application:HelloWorld2021-12-2817:37:25.579INFO65136---[main]com.didispace.chapter81.Application:HelloWorld打开DEBUG日志我们可以通过两种方式切换到DEBUG级别:第一种:运行命令后加上--debug标志,如:$java-jarmyapp.jar--debug第二种:在配置文件application.properties中配置debug=true。这里启用的DEBUG日志只影响核心Logger,包括嵌入式容器、hibernate、spring等,这些框架级别会输出更多的内容,但是你自己应用的日志不会输出DEBUG级别的。从下面的截图我们可以看到自己写的调试级别HelloWorld不输出日志配置。下面介绍一些常用的日志配置,帮助我们更好的管理日志内容。彩色输出如果您的终端支持ANSI,设置彩色输出将使日志更具可读性。它通过在application.properties中设置spring.output.ansi.enabled参数来支持。该参数有3个选项:NEVER:禁用ANSI彩色输出DETECT:检查终端是否支持ANSI,支持则使用彩色输出(默认项)ALWAYS:始终使用ANSI彩色格式输出。如果终端不支持,就会有很多干扰信息。不建议使用。注意:在SpringBoot1.x中,默认值为NEVER,2.x之后,默认值为DETECT。所以看看我们上面的截图,它已经默认着色了。所以如果你是SpringBoot2.x版本的用户,基本不需要修改。文件输出SpringBoot默认的配置只会输出到控制台,不会记录到文件中,但是我们在生产环境中使用时通常需要记录到文件中。增加文件输出,需要在配置文件application.properties中配置几个参数,比如这样:logging.file.name=run.loglogging.file.path=./logging.file.name:设置文件名logging。文件。path:设置文件路径注意:这个和1.x版本不同。1.x中对应的参数是logging.file和logging.path。文件滚动将日志一直输出在一个文件中显然是不合适的,任何日志框架都会为此准备日志文件的滚动配置。由于本文会配置默认配置,所以是Logback的配置,具体为:logging.logback.rollingpolicy.file-name-pattern:用于创建日志文件的文件名模式。logging.logback.rollingpolicy.clean-history-on-start:应用启动时是否清理日志归档,默认为false,不清理logging.logback.rollingpolicy.max-history:最大归档数logfilestokeep,默认7个删除前的日志文件,默认为0B级别控制如果想对每个Logger做一些简单的输出级别控制,只需要在application.properties中配置即可。配置格式:logging.level.*=LEVELlogging.level:日志级别控制前缀,*为包名或Logger名.didispace=DEBUG:com.didispace包下的所有类都以DEBUG级别输出日志。root=WARN:根日志以WARN级别输出。做完这些配置后,就可以再次执行上面的程序了。原来调试级别的HelloWorld可以成功导出。logging.level.com.didispace=DEBUG自定义日志配置由于日志服务一般在ApplicationContext创建前就已初始化,所以不必通过Spring配置文件来控制。因此,通过系统属性和传统的SpringBoot外部配置文件,仍然可以很好地支持日志的控制和管理。根据不同的日志系统,可以按照以下规则组织配置文件名,这样才能正确加载:log4j2-spring.xml,log4j2.xmlJDK(JavaUtilLogging):logging.propertiesSpringBoot官方推荐使用带-spring的文件名作为你的日志配置(比如使用logback-spring.xml而不是logback.xml)来自定义输出格式在SpringBoot中,可以通过在application.properties中配置以下参数来控制输出格式:logging.pattern.console:定义输出到控制台的样式(不支持JDKLogger):定义输出到文件的样式(不支持JDKLogger)本文的完整工程可以在下面仓库2.x目录下的chapter8-1工程中查看:Github:https://github.com/dyc87112/SpringBoot-Learning/Gitee:https://gitee.com/didispace/SpringBoot-学习/