1.需求/目的
- 日志的标准化输出
- 日志文件的自动创建与拆分
2.使用环境
- spring boot 2.0.3
- logback 1.2.3(默认)
3.maven 引入logback
- 引用spring-boot-starter即可使用logback
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${org.springframework.boot.version}</version>
</dependency>
spring-boot-starter包含了spring-boot-starter-logging的引用
spring-boot-starter-logging
spring-boot-starter-logging包含了logback的引用
ch.qos.logback
4.在配置文件进行设置
#设置日志使用的配置文件
logging.config=classpath:logback-spring.xml
#日志的输出文件夹,该值在logback-spring.xml文件中进行使用
logback.logdir=G:\\pringboot_log
#设置日志输出的文件,可以是相当路径或绝对路径,相对路径则在在项目的当前路径下生成一个xxx.log文件
#logging.file=debug.log
#设置日志输出的目录,如果logging.file和logging.path同时使用,以logging.file为准
#logging.path=G:\\springboot_log
##对日志的内容进行格式化
#logging.pattern.console="%d - %msg%n"
#设置日志输出的级别,logging.level.包名或类名=级别; TRACE < DEBUG < INFO < WARN < ERROR < FATAL
#logging.level.com.authstr=INFO
通过配置文件的设置,无法满足使用需求.
需要通过logback-spring.xml文件进行设置,文件放到resources目录下
"logback-spring"是spring boot 默认会读取的日志配置文件名称之一,不定义logging.config也可以正常使用
5.通过xml文件配置日志
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:配置文件改变时,是否重新加载,默认true; scanPeriod:检测配置文件改变的间隔; debug:是否打印出logback内部日志信息,默认false -->
<Configuration scan="true" scanPeriod="60 seconds" debug="false" >
<!-- 设置上下文名称,默认名称"default" , 一般用于区分不同应用程序的日志,该设置不可动态修改,可以通过%contextName打印-->
<!--<contextName>default</contextName>-->
<!-- 设置变量,通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量-->
<!--<property name="logback.logdir" value="G:\springboot_log"/>
<property name="logback.appname" value="sd-basic"/>-->
<!-- 从配置文件中获取并重新定义变量,name:新的变量名; source:变量值的来源 -->
<springProperty scope="context" name="logback.appname" source="server.servlet.context-path"/>
<springProperty scope="context" name="logback.logdir" source="logback.logdir"/>
<!-- 用来格式化日志输出节点,class用来指定哪种输出策略-->
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--layout为控制层输出,文件输出用encoder-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
<!-- 定义输出格式 -->
<!--%d{HH: mm:ss.SSS}——日志输出时间
%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger{36}——日志输出者的名字
%msg——日志消息
%n——平台的换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${logback.appname} [%thread] [%-5level] [%logger{36}] > > > %msg %n</pattern>
</pattern>
</layout>
<!-- 拦截器,ERROR以下的日志不输出 -->
<!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>-->
</appender>
<!-- 输出info日志文件 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logback.logdir}/${logback.appname}-info.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logdir}/${logback.appname}-info-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${logback.appname} [%thread] [%-5level] [%logger{36}] > > > %msg %n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>30MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 输出error日志文件 -->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>Error</level>
</filter>
<File>${logback.logdir}/${logback.appname}-error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logdir}/${logback.appname}-error-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${logback.appname} [%thread] [%-5level] [%logger{36}] > > > %msg %n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>30MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 指定一个包或类使用的打印级别与配置-->
<!-- name:指定包或类;level:打印级别,默认继承上级配置的级别; addtivity:是否向上级loger传递打印信息。默认是true。-->
<!--<logger name="com.example.demo.controller" level="ERROR" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>-->
<!-- 修改hibernate的日志打印 -->
<!-- 打印sql语句 -->
<logger name="org.hibernate.SQL" level="DEBUG"/>
<!-- 打印sql语句绑定的参数 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
<!-- 打印sql语句的返回值 -->
<!--<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="TRACE"/>-->
<!-- 打印Hql语句 -->
<!--<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>-->
<!-- 必选子节点,可以包含零个或多个元素 -->
<!-- 用来指定最基础的日志输出级别,级别可选TRACE, DEBUG, INFO, WARN, ERROR, ALL , OFF,默认DEBUG, TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
<root level="INFO">
<!-- 将指定的appender添加到logging -->
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
<!-- 根据spring.profiles.active的值执行相对应的设置,用于进行多环境的日志配置 -->
<!--<springProfile name="test,dev">-->
<!--<logger name="com.example.demo.controller" level="DEBUG" additivity="false">-->
<!--<appender-ref ref="consoleLog"/>-->
<!--</logger>-->
<!--</springProfile>-->
</Configuration>
6.打印日志
声明日志对象
protected Logger log = LoggerFactory.getLogger(this.getClass());
根据需要进行打印
// TRACE < DEBUG < INFO < WARN < ERROR < FATAL
this.log.info("info");
this.log.warn("warn");
this.log.error("error");
this.log.debug("debug");
this.log.trace("trace");
效果
日志打印