Springboot配置logback在控制台输出日志
在实际开发的过程中,我们常常会遇到复杂的日志需求。比如每天输出一个日志文件,比如将info和error的消息分别输出到两个文件中,还比如在控制台中我希望输出自定义的内容(如输出日志的类、等级、内容),并且将这些内容用不同的颜色在控制台显示出来。还比如我们需要定义某个包下的日志格式,这些都需要我们在Springboot项目中用xml格式的文件配置。
创建xml文件
我们在resource下新建一个xml文件,命名为logback-spring.xml。在springboot中,只有按照如下规则命名配置文件才能被正确加载
-
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
-
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
-
Log4j2:log4j2-spring.xml, log4j2.xml
-
JDK (Java Util Logging):logging.properties
定义控制台日志格式
首先在logback-spring.xml下写一个configuration标签
<?xml version="1.0" encoding="utf-8" ?> <configuration> </configuration>
接着我们来定义控制台的输出格式,使用property定义常量,加入到根节点
<property name="CONSOLE_INFO_LOG_PATTERN" value="%white(%date{yyyy-MM-dd HH:mm:ss}) |%white(%-5level) |%white(%thread) |%white(%file:%line) |%cyan(%logger) |%blue(%msg%n)"/>
其中name为常量名,value为常量值,也就是我们需要定义的格式,%(颜色)为定义后一个括号内输出变量颜色值,%date表示输出时间,%level表示输出等级,%thread表示是哪个线程输出了这个日志。
接着我们需要在根节点加入一个appender标签
<!--控制台输出info--> <appender name="consoleInfoLog" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> ${CONSOLE_INFO_LOG_PATTERN} </pattern> </layout> </appender>
class定义为ConsoleAppender,layout的class定义为PatternLayout。在pattern中输入上面定义的格式,接着在根节点配置root标签,表示在所有包下生效,ref中写上appender的name,配置完毕
<!--使用配置,作用域为sell--> <root level="info"> <appender-ref ref="consoleInfoLog"/> </root>
自定义包输出格式
在测试的过程中,我们常常会找不到自己输出的信息,而被其他输出的信息掩盖,此时可以给自己项目包下的输出的日志定义单独的格式
property:我们将包名加黄
<property name="PACKAGE_INFO_LOG_PATTERN" value="%white(%date{yyyy-MM-dd HH:mm:ss}) |%white(%-5level) |%white(%thread) |%yellow(%file:%line) |%cyan(%logger) |%blue(%msg%n)"/>
appender:只输出info信息,用filter过滤
<!--控制台输出sell包下的info--> <appender name="packageAllInfo" class="ch.qos.logback.core.ConsoleAppender"> <!--根据范围过滤--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> ${PACKAGE_INFO_LOG_PATTERN} </pattern> </layout> </appender>
上面配置的是root标签,表示所有包全部输出,这里我们配置logger覆盖root的配置,填写你自己的包名。
<logger name="com.xxx.xxx" level="DEBUG" additivity="false"> <appender-ref ref="packageAllInfo" /> </logger>
配置完成,让我们看看效果
@Slf4j public class TestLog { @Test public void testLog(){ String name="测试logback"; log.info(name); } }
输出:
最终的配置文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <property name="CONSOLE_INFO_LOG_PATTERN" value="%white(%date{yyyy-MM-dd HH:mm:ss}) |%white(%-5level) |%white(%thread) |%white(%file:%line) |%cyan(%logger) |%blue(%msg%n)"/> <property name="PACKAGE_INFO_LOG_PATTERN" value="%white(%date{yyyy-MM-dd HH:mm:ss}) |%white(%-5level) |%white(%thread) |%yellow(%file:%line) |%cyan(%logger) |%blue(%msg%n)"/> <property name="CONSOLE_INFO_ERROR_PATTERN" value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%red(%-5level) |%blue(%thread) |%blue(%file:%line) |%cyan(%logger) |%yellow(%msg%n)"/> <property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n"/> <!--控制台输出sell包下的info--> <appender name="packageAllInfo" class="ch.qos.logback.core.ConsoleAppender"> <!--根据范围过滤--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> ${PACKAGE_INFO_LOG_PATTERN} </pattern> </layout> </appender> <!--控制台输出info--> <appender name="consoleInfoLog" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> ${CONSOLE_INFO_LOG_PATTERN} </pattern> </layout> </appender> <!--使用配置,作用域为sell--> <root level="info"> <appender-ref ref="consoleInfoLog"/> </root> <logger name="com.mola.sell" level="DEBUG" additivity="false"> <appender-ref ref="packageAllInfo" /> </logger> </configuration>