logback.xml与logback-spring.xml
配置文件的加载顺序
logback.xml—>application.properties—>logback-spring.xml
如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。
# application.properties加载指定配置文件
logging.config=classpath:logback-spring.xml
如果使用的是 logback.xml,里面引用了application.yml的变量,那么会获取不到,需要改为logback-spring.xml。
logback.xml一般用于非Spring Boot项目,logback-spring.xml用于Spring Boot项目
存放的位置
logback-spring.xml存放的位置是在SpringApplication主类所在的项目的resources目录,也就是application.yml或者application.properties所在的目录。
logback.xml存放的位置是在你启动的那个类所在的项目的resources目录。
本文使用的是logback-spring.xml。
application.yml
日志级别 logging.level
日志级别 trace<debug<info<warn<error<fatal
默认级别为info,即默认打印info及其以上级别的日志。
logging.level设置日志级别,后面跟生效的区域,比如root表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写)
参考:https://www.cnblogs.com/yanguobin/p/11487667.html
logging.path 或者 logging.file
注意:它们不会同时生效,只配置其中一个就好了。若同时指定logging.path和logging.file,则logging.path不会生效,只会按照logging.file生成
例如:
logging.path = ./logs
logging.file,只指定文件名,会生成在当前总项目目录下;同时指定目录和文件名,会在指定目录下生成指定文件名的日志文件(相对路径,则会生成在当前总项目目录下)。
注意:但当只指定已存在的目录时,是不起作用的,是无效的,若后面跟上不存在的目录或文件,则会生成日志文件。
#/logDemo,目录已存在的时,无法生成日志文件
logging.file=/logDemo
参考:https://www.cnblogs.com/yanguobin/p/11486584.html
logback-spring.xml引用application.yml变量
${LOG_PATH:-.}对应logging.path日志文件路径
<property name="LOG_PATH" value="${LOG_PATH:-.}"></property>
<fileNamePattern>${LOG_PATH}/info.%d.%i.log</fileNamePattern>
参考:解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题_log_path:-_chlearning125的博客-优快云博客
完整示例
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration>
<!--输出到控制台-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
</pattern>
</layout>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
</pattern>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/var/log/main-module/info.%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/var/log/main-module/error.%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
配置项
一个父标签:configuration
两种属性:contextName和property
三个节点:appender、root、logger
configuration
scan
当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod
设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug
当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
contextName
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
如果同时存在logback.xml和logback-spring.xml。如果这两个配置文件的contextName不同,就会报错。
property
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用定义日志目录,然后在设置日志文件时使用。
append节点
appender的意思是追加器,在这里可以理解为一个日志的渲染器(或者说格式化日志输出)。比如渲染console日志为某种格式,渲染文件日志为另一种格式。
appender中有name和class两个属性:name表示该渲染器的名字;class表示使用的输出策略。
常见的有控制台输出策略(class="ch.qos.logback.core.ConsoleAppender")和文件输出策略(class="ch.qos.logback.core.rolling.RollingFileAppender")。
控制台输出
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %red(%logger{50}) - %yellow(%msg) %n"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置日志的颜色和高亮 -->
<!-- <pattern>${pattern-color}</pattern> -->
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
文件输入
rollingPolicy表示日志记录器的滚动策略
SizeBasedTriggeringPolicy:基于文件大小进行滚动;
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<!--表示按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<!--当文件大小超过5MB时,通知RollingPolicy轮转-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
TimeBasedRollingPolicy:根据时间定义翻转策略,例如按天或按月。TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口,既负责滚动也负责触发滚动。
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
<file>${log.path}/log_debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
SizeAndTimeBasedRollingPolicy:TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。按日期归档文件,但同时限制每个日志文件的大小。最常用的滚动策略。
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--将当天的日志记录在<file>,然后将昨天的日志归档到下面的文件中-->
<!--按天切分 %d{yyyy-MM-dd} %i指定索引-->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--单个日志文件最大100M,超过后再创建一个日志文件,日志文件的名字最后+1-->
<maxFileSize>100MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
<!--所有的日志文件最大20G,超过就会删除旧的日志-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<!--此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
encoder表示日志文件的格式
%d表示时间
%thread表示线程名
%-5level 表示日志级别,允许以五个字符长度输出
%logger{50}表示具体的日志输出者,比如类名,括号内表示长度
%msg表示具体的日志消息,就是logger.info("xxx")中的xxx
%n表示换行
onMatch和onMismatch都有三个属性值,分别为Accept、DENY、NEUTRAL
onMatch="ACCEPT" 匹配该级别及以上
onMatch="DENY" 不匹配该级别及以上
onMatch="NEUTRAL" 该级别及以上的由下一个filter处理如果当前是最后一个,则是匹配该级别及以上
onMismatch="ACCEPT" 匹配该级别以下
onMismatch="DENY" 不匹配该级别以下
onMismatch="NEUTRAL" 该级别及以下的由下一个filter处理如果当前是最后一个,则不匹配该级别以下的
当需要将info以上级别的都输出到info日志中,可以使用ch.qos.logback.classic.filter.ThresholdFilter这个过滤器。
<!--临界值日志过滤级别配置 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 在日志配置级别的基础上过滤掉info级别以下的日志 -->
<level>INFO</level>
</filter>
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<!-- 追加方式记录日志 -->
<append>true</append>
root
root节点实际上是配置启用哪种appender,可以添加多个appender。
root配置必须在appender下边。
root节点的level是总的日志级别控制:
如果appender的日志级别设定比root的高,会按照appender的日志级别打印日志,
如果appender的日志级别比root的低,会按照root设定的日志级别进行打印日志
也就是说root设定的日志级别是最低限制,如果root设定级别为最高ERROR,那么所有appender只能打印最高级别的日志。
logger
对单个包或类添加配置:name:用来指定受此loger约束的某一个包或者具体的某一个类。
addtivity:是否向上级loger传递打印信息。默认是true。
<logger name="com.pikaqiu.logbackdemo" level="debug" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO">
<appender-ref ref="STDOUT"/>
</logger>
root和logger是父子的关系。
logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍!
环境配置
配置多环境日志输出 可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<!--生产环境:输出到文件-->
<springProfile name="pro">
<root level="info">
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WARN_FILE" />
</root>
</springProfile>
<!--开发环境:打印控制台-->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
</configuration>