写点什么

SpringBoot 日志配置 (logback)

用户头像
xcbeyond
关注
发布于: 2 小时前

SpringBoot 支持 Java Util Logging,Log4J,Log4J2 和 Logback 日志框架,默认采用 logback 日志。在实际 SpringBoot 项目中使用 SpringBoot 默认日志配置是不能够满足实际生产及开发需求的,需要选定适合的日志输出框架,灵活调整日志输出级别、日志输出格式等。


本章主要讲述如何进行 SpringBoot 项目的日志详细配置。


(强烈建议使用 Logback 日志配置,因为它比 log4j 性能好多很多。)

1、添加日志依赖包

SpringBoot 项目中依赖包 spring-boot-starter 中已经包含 spring-boot-starter-logging,该依赖包就是默认的 logback 日志框架,则不需额外引入。



2、添加 logback.xml


在/springboot/src/main/resources 目录下,新建日志配置文件 logback.xml,如下:


(配置说明见注释)


<?xml version="1.0" encoding="UTF-8" ?><!--     scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位默认单位是毫秒,当scan为true时此属性生效,默认时间间隔为1分钟    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false --><configuration scan="true" scanPeriod="2 seconds">    <!--     	定义滚动记录文件appender 作用:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件         RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"       	 参数:             <append>:如果是true日志被追加到文件结尾,如果是false清空现存文件,默认是true            <file>:被写入的文件名,可以是相对目录也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值            <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名            <triggeringPolicy>:告知RollingFileAppender合适激活滚动            <prudent>:当为true时不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有两个限制:1不支持也不允许文件压缩,2不能设置file属性必须留空    -->    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!-- 如果是true,日志被追加到文件结尾,如果是false,清空现存文件.默认是true -->        <prudent>true</prudent>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">        	<!-- 每天滚动一次的日志 只保留30天内的日志文件 -->            <fileNamePattern>logs/%d{yyyy-MM-dd}/springboot_%i.log</fileNamePattern>            <maxHistory>30</maxHistory>            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <maxFileSize>10MB</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">        	<!-- 对日志进行格式化 -->            <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>        	<charset>utf-8</charset>        </encoder>    </appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <prudent>true</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/%d{yyyy-MM-dd}/springboot-error_%i.log</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 配置日志级别过滤器 作用:根据日志级别进行过滤,如果日志级别等于配置级别过滤器会根据onMath和onMismatch接收或拒绝日志 参数: <level>:设置过滤级别 <onMatch>:用于配置符合过滤条件的操作 <onMismatch>:用于配置不符合过滤条件的操作 此处配置为只接收ERROR日志级别信息 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
<!-- 定义控制台appender 作用:把日志输出到控制台 class="ch.qos.logback.core.ConsoleAppender" --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern> </layout> </appender>
<!-- 将root的打印级别设置为"error",指定了名字为"console","fileAppender","errorAppender"的appender --> <root level="error"> <appender-ref ref="console"/> <appender-ref ref="fileAppender"/> <appender-ref ref="errorAppender"/> </root> <!-- logger用来设置某一个包的日志打印级别 <loger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性 name:用来指定受此loger约束的某一个包或者具体的某一个类 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF addtivity:是否向上级loger传递打印信息。默认是true,会将信息输入到root配置指定的地方,可以包含多个appender-ref,标识这个appender会添加到这个logger --> <logger name="com.xcbeyond.springboot" level="debug"/></configuration>
复制代码


3、日志打印


已项目启动类中输出 debug 日志为例说明。

package com.xcbeyond.springboot;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * SpringBoot启动类 * @author xcbeyond * 2018年7月2日下午5:41:45 */@SpringBootApplicationpublic class SpringbootApplication { private static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);
public static void main(String[] args) { if(logger.isDebugEnabled()) { logger.debug("SpringBoot starting..."); } SpringApplication.run(SpringbootApplication.class, args); }}import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * SpringBoot启动类 * @author xcbeyond * 2018年7月2日下午5:41:45 */@SpringBootApplicationpublic class SpringbootApplication { private static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);
public static void main(String[] args) { if(logger.isDebugEnabled()) { logger.debug("SpringBoot starting..."); } SpringApplication.run(SpringbootApplication.class, args); }}
复制代码

注:请使用包 org.slf4j.Logger、org.slf4j.LoggerFactory。SLF4J 只是一个日志标准,并不是日志框架的具体实现,便于后期维护时可以根据不同的日志 框架配置不同类型的日志,而不用修改日志输出代码。


4、启动项目


在项目的同级目录下会生成 logs\2018-07-11\日志文件夹及日志文件。点击并拖拽以移动​


发布于: 2 小时前阅读数: 2
用户头像

xcbeyond

关注

🚩InfoQ写作平台签约作者 2019.06.20 加入

公众号:程序猿技术大咖,专注于技术输出、分享。

评论

发布
暂无评论
SpringBoot 日志配置(logback)