root 节点是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,用于设置打印级别,可选以下:TRACE
,DEBUG
,INFO
,WARN
,ERROR
,ALL
,OFF
。spring
root 节点能够包含 0 个或多个元素,将appender
添加进来。以下:缓存
<root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
appender 也是子节点之一,将会在后面说明。安全
用于定义变量,方便使用。有两个属性:name,value。定义变量后,能够使用${}
来使用变量。以下:数据结构
<property name="path" value="./log"/> <property name="appname" value="app"/>
appender中有2个必填属性--name和class。name为节点的名称,class为的全限定类名,也就是日志输出目的地的处理类。其中,encoder子节点用来控制日志的输出格式app
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender>
appender 用来格式化日志输出的节点,这个最重要。有两个属性:框架
下面经过例子来讲明这个怎么用:异步
在logback中,主要有如下三种日志目的地处理类:async
将日志输出到控制台maven
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender>
将日志输出到具体的磁盘文件中,能够单独指定具体的位置,也能够设置日志的输出格式;spring-boot
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
子节点append:新增的日志是否以追加到文件结尾的方式写入到log.out文件中,true为追加,fasle为清空现存文件写入;
子节点prudent:日志是否被安全的写入磁盘文件,默认为false。若是为true,则效率低下;
滚动记录日志,当符合rollingPolicy节点中设置的条件时,会将现有日志移到新的文件中去。rollingPolicy节点中可设置的条件为:文件的大小、时间等;
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
异步记录日志,内部经过使用缓存的方式来实现异步打印,将日志打印事件event放入缓存中。具体数据结构为BlockingQueue;
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>512</queueSize> <appender-ref ref ="FILE"/> </appender>
子节点queueSize:指的是BlockingQueue的队列容量大小,默认为256个;
子节点discardingThreshold:若是BlockingQueue中还剩余20%的容量,那么程序会丢弃TRACE、DEBUG和INFO级别的日志打印事件event,只保留WARN和ERROR级别的。为了保留全部的日志打印事件,能够将该值设置为0。
日志文件的滚动策略,与RollingFileAppender搭配使用,当日志文件发生变更时决定RollingFileAppender的行为。在rollingPolicy节点中有一个class属性,可选的值为TimeBasedRollingPolicy、FixedWindowRollingPolicy、TriggeringPolicy。其中ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根据时间制定日志文件的滚动策略;
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy>
ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示若是日志文件大小超过指定范围时,会根据文件名拆分红多个文件;
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>tests.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>4</maxIndex> </rollingPolicy>
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--设置存储路径变量--> <property name="LOG_HOME" value="./log"/> <!--控制台输出appender--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!--设置输出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--设置编码--> <charset>UTF-8</charset> </encoder> </appender> <!--文件输出,时间窗口滚动--> <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志名,指定最新的文件名,其余文件名使用FileNamePattern --> <File>${LOG_HOME}/timeFile/out.log</File> <!--文件滚动模式--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩--> <FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log.gz</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"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--设置编码--> <charset>UTF-8</charset> </encoder> </appender> <!-- 异步输出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,若是队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="timeFileOutput"/> </appender> <!--指定基础的日志输出级别--> <root level="INFO"> <!--appender将会添加到这个loger--> <appender-ref ref="console"/> <appender-ref ref="timeFileOutput"/> </root> </configuration>
SpringBoot工程自带logback和slf4j的依赖,因此只要在maven依赖中添加了spring-boot-starter-logging便可。logback框架会默认加载classpath下命名为logback-spring或logback的配置文件。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
若是无需复杂的日志配置,执行简单设置日志打印级别,打印方式可直接在 application.yml 中配置。
logging: # 配置日志存放路径,日志文件名为:spring.log path: e:/log file: # 设置日志文件大小 max-size: 20MB level: # root日志以info级别输出 root: info # 此包下全部class以DEBUG级别输出 com.demo.test: debug
Spring Boot 官方推荐优先使用带有 -spring 的文件名做为你的日志配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名为 logback-spring.xml 的日志配置文件, spring boot 能够为它添加一些 spring boot 特有的配置项示例以下:
<configuration> <!-- 测试环境+开发环境. 多个使用逗号隔开. --> <springProfile name="test,dev"> <logger name="com.test.demo" level="DEBUG" additivity="false"> <appender-ref ref="console"/> </logger> </springProfile> <!-- 生产环境. --> <springProfile name="prod"> <logger name="com.test.demo" level="INFO" additivity="false"> <appender-ref ref="timeFileOutput"/> </logger> </springProfile> </configuration>