springboot学习之六(项目的日志配置)
1. 日志的作用
日志记录了系统行为的时间、地点、状态等相关信息,能够帮助我们了解并监控系统状态,在发生错误或者接近某种危险状态时能及时提醒我们处理,同时在系统产生问题,能够帮助我们快速定位、诊断问题。
2. 常用的日志框架
log4j:Log4j是Apache的一个Java的日志库,是一款非常古老的日志框架,开发团队于2015年宣布log4j生命的终结
logback:Logback由实现Log4j的开发人员编写,其目标是成为其继任者。它遵循与Log4j相同的概念,但被重写是为了提高性能,以及实现其他一些改进,如高级过滤选项和自动重新加载日志配置。目前spring boot项目默认使用的就是lagback日志。
log4j2:Log4j2是对Log4j的升级,它比其前身Log4j提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题,目前是这三种日志框架中速度最快的。
3. 日志门面SLF4J
简单日志门面(Simple Logging Facade For Java)slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案。也可以将其理解为一个多种类型的转接头,提供一个接口来对接不同的日志框架。也就是我们平时项目开发的时候使用的@Slf4j注解,无论我们使用的是log4j还是logback日志框架,都可以通过使用这个注解,然后通过log.info()等来进行日志的打印。
4. 日志框架的详解
由于只实践了logback与log4j2这两种日志框架,所以在这边只介绍logback和log4j2这两种日志框架。
4.1 logback日志框架
- 日志级别
TRACE < DEBUG < INFO < WARN < ERROR < FATAL - 添加依赖
由于spring boot项目中默认使用的就是logback日志框架,logback的依赖spring-boot-starter-logging已经包含在了spring-boot-starter依赖中,所以只要引入的有spring-boot-starter依赖我们这边就不需要再次引入依赖 - 日志配置
其主要有两种配置方式,一种是简单的配置,直接再applicatin.properties配置文件中进行相关的配置即可,第二种则是通过xml配置文件进行配置,在使用xml配置文件进行配置的时候需要注意,如果配置文件的名称不是logback-spring.xml并且是再resource目录下时,需要通过在application.properties配置文件中进行如下设置:
logging.config=classpath:日志配置文件名.xml
(1)通过application.properties配置文件配置日志信息
#配置日志格式 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %-50logger{36} : %msg%n #日志输出文档路径 logging.file.name=D:/log/music/log.log #日志归档,这边的意思时每天输出一个日志文件 logging.logback.rollingpolicy.file-name-pattern=D:/log/music/log-info-%d{yyyy-MM-dd}.%i.log logging.logback.rollingpolicy.clean-history-on-start=false logging.logback.rollingpolicy.max-file-size=10MB #设置日志最多存在的个数,如果上面日期格式是天的话,这里就是最多存在30天,如果是月的话,最多就是30个月 logging.logback.rollingpolicy.max-history=30
(2)通过xml配置文件进行配置
-
- 配置参数说明:
- 根节点
<configuration>
:标签包含三个属性
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
例如:<configuration scan="true" scanPeriod="10 seconds" debug="false"> </configuration>
- 子节点
<contextName>
:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>
设置成其他名字,用于区分不同应用程序的记录。
例如:<contextName>musicLogback</contextName>
- 子节点
<property>
:标签用来定义变量值,有name和value两个属性,能够在上下文通过${}来进行引用变量,可以说就相当于一个map,name为key,value为value
name:变量的名称
value:变量定义的值
例如:<property name="LOG_PATH" value="D:/log/music"/> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> PS:(1)使用的时候直接${LOG_PATH}或者${FILE_LOG_PATTERN}就可直接引用这个value的值了 (2)pattern的具体参数信息描述可看下面完整的xml中的注释。
- 子节点
<timestamp>
:标签,有key和datePattern两个属性
key:标识该timestamp标签的名字
datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
例如:<timestamp key="SECOND" datePattern="yyyy-MM-dd HH:mm:ss"/>
<appender>
标签,负责写日志的组件,有两个必要的属性name和class,
name:指定appender名称,
class:指定appender全限定名-
ConsoleAppender:把日志输出到控制台,有以下子节点
<encoder>
:对日志进行格式化
例如:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN}</pattern> <!--字符集--> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender>
-
FileAppender:把日志添加到文件,有以下子节点
<file>
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。<append>
:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。<encoder>
:对日志进行格式化
例如:
<appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_PATH}/info/log.log</file> <append>true</append> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender>
-
RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点
<file>
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。<append>
:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。<rollingPolicy>
:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,有如下:- class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
<fileNamePattern>
:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d<maxHistory>
:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>
是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy":查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。有以下节点:
<maxFileSize>
:活动文件的大小,默认值是10MB。
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy":根据固定窗口算法重命名文件的滚动策略。有以下子节点:
<minIndex>
:窗口索引最小值<maxIndex>
:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。<fileNamePattern>
:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log。还可以指定文件压缩选项log%i.log.gz或者log%i.log.zip
- class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
例如:
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/info/log.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender>
-
<filter>
标签:主要是过滤,一般用在<appender>
标签中,有如下两个过滤器,也就是类名:- LevelFilter:根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。比如:
<level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> onMatch值有三个选项: ACCEPT:表示匹配该级别及以上 DENY:表示不匹配该级别及以上 NEUTRAL:表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 onMisMatch值有三个选项: ACCEPT:表示匹配该级别以下 DENY:表示不匹配该级别以下的 NEUTRAL:表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
- ThresholdFilter:过滤低于指定阈值的事件。 对于等于或高于阈值的事件通行,比如:
<level>DEBUG</level> 表示只打印日志级别高于等于DEBUG级别的日志
- LevelFilter:根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。比如:
<logger>
标签:用来设置某一个包或具体的某一个类的日志打印级别、以及指定,具有name,level,additivity属性
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF
additivity:是否向上级logger传递打印信息,也就是是否将日志流反馈到root中。默认是true。
例如:<logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/>
<root>
标签:全局配置,本质上也是一个logger,只不过name属性恒为root,是所有logger的上级,默认所有的Logger都继承此配置
例如:<root> <!--appender-ref标签:用来指定日志输出到哪个appender--> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> <appender-ref ref="ROLLING_FILE"/> </root>
- 根节点
- 完整的xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!--日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出--> <!--configuration 标签包含三个属性 scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="10 seconds" debug="false"> <!--子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。--> <contextName>musicLogback</contextName> <!-- property标签用来定义变量值,有name和value两个属性,能够在上下文通过${}来进行引用变量,可以说就相当于一个map,name为key,value为value name:变量的名称 value:变量定义的值 --> <property name="LOG_PATH" value="D:/log/music"/> <!-- timestamp标签,有key和datePattern两个属性 key:标识该timestamp标签的名字 datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。 --> <timestamp key="SECOND" datePattern="yyyy-MM-dd HH:mm:ss"/> <!--彩色日志依赖的渲染类--> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> <!-- 控制台彩色日志格式 --> <property name="LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- 写入到文件日志格式 --> <!-- -X号: X信息输出时左对齐; %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: 输出自应用启动到输出该log信息耗费的毫秒数 %c: 输出日志信息所属的类目,通常就是所在类的全名 %t: 输出产生该日志事件的线程名 %%: 输出一个"%"字符 %F: 输出日志消息产生时所在的文件名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信息 %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。 5)更多命令描述链接:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout --> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- appender标签,负责写日志的组件,有两个必要的属性name和class, name:指定appender名称, class:指定appender全限定名 ConsoleAppender:把日志输出到控制台,有以下子节点 <encoder>:对日志进行格式化 FileAppender:把日志添加到文件,有以下子节点 <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。 <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 <encoder>:对日志进行格式化 RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点 <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。 <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,有如下: class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy":最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点: <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM} <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。 class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy":查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。有以下节点: <maxFileSize>:活动文件的大小,默认值是10MB。 class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy":根据固定窗口算法重命名文件的滚动策略。有以下子节点: <minIndex>:窗口索引最小值 <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。 <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 log%i.log,会产生归档文件log1.log和log2.log。还可以指定文件压缩选项log%i.log.gz或者log%i.log.zip --> <!--将日志输出到控制台,并且只输出INFO级别及比其级别高的日志--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN}</pattern> <!--字符集--> <charset>UTF-8</charset> </encoder> <!-- filter标签:主要是过滤,有两个过滤器 LevelFilter:根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。比如: <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> 这种表示只记录INFO级别的 onMatch值有三个选项: ACCEPT:表示匹配该级别及以上 DENY:表示不匹配该级别及以上 NEUTRAL:表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上 onMisMatch值有三个选项: ACCEPT:表示匹配该级别以下 DENY:表示不匹配该级别以下的 NEUTRAL:表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 ThresholdFilter:过滤低于指定阈值的事件。 对于等于或高于阈值的事件通行,比如: <level>DEBUG</level> 表示只打印日志级别高于等于DEBUG级别的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <!--输出日志到指定文件目录的log.log中,日志被追加到文件结尾,输入INFO及比其等级高的日志--> <appender name="INFO_FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_PATH}/info/log.log</file> <append>true</append> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <!--输出日志到指定文件目录的log.log中,日志被追加到文件结尾,只输入ERROR级别的日志--> <appender name="ERROR_FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_PATH}/error/log.log</file> <append>true</append> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--每天生成一个日志文件,保存30天的日志。这个可以理解为按照天数,每天一个日志文件及逆行保存日志记录,保存INFO及INFO级别以上的日志--> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/info/log.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <!-- logger标签:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>,具有name,level,additivity属性 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF additivity:是否向上级logger传递打印信息,也就是是否将日志流反馈到root中。默认是true。 --> <logger name="com.apache.ibatis" level="TRACE"/> <logger name="java.sql.Connection" level="DEBUG"/> <logger name="java.sql.Statement" level="DEBUG"/> <logger name="java.sql.PreparedStatement" level="DEBUG"/> <!--root标签:全局配置,本质上也是一个logger,只不过name属性恒为root,是所有logger的上级,默认所有的Logger都继承此配置--> <root> <!--appender-ref标签:用来指定日志输出到哪个appender--> <appender-ref ref="CONSOLE"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> <appender-ref ref="ROLLING_FILE"/> </root> </configuration>
运行效果
1.控制台效果:
- 配置参数说明:
4.2 log4j2日志框架
- 日志级别
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF - 引入依赖
这边需要注意的的是由于spring boot项目自动引入了logback日志的依赖,所以这边要使用log4j2需要先把logback的依赖过滤出去
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--使用log4j2需要把logback的依赖排除,防止冲突,需要在每个有spring-boot-start的依赖中添加--> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--log4j2日志依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
在网上找到了一个全局排除spring-boot-logging依赖的方法
<!--全局排除spring-boot-starter-logging内的所有依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
-
- 日志配置
这边我主要是通过xml配置文件进行日志配置的,这边需要注意的是当配置文件的名称不是log4j2-spring.xml时,需要在application.properties配置文件中,配置下面的属性指定日志文件的位置:
logging.log4j2.config.override=classpath:日志配置文件的名称.xml
(1)通过xml文件进行日志配置
- 配置参数说明
这边的配置参数与logback日志的参数基本上一样,这边就不在此说明了 - 完整的xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <Configuration> <Properties> <Property name="LOG_PATH">D:/log/music/log4j2</Property> <!--彩色日志--> <Property name="CONSOLE_LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property> <!--写入到文件中的日志,非彩色--> <Property name="FILE_LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} --- [%15.15t] %-40.40c{1.} : %m%n%xwEx</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${CONSOLE_LOG_PATTERN}"></PatternLayout> </Console> <!-- 打印出所有的info及以上级别信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingFile name="INFO_LOG" fileName="${LOG_PATH}/log-info.log" filePattern="${LOG_PATH}/log-info-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="${FILE_LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!--按大小分--> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <Filters> <!-- 只记录info和以上级别信息 --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 --> <DefaultRolloverStrategy max="10"/> </RollingFile> <!-- 存储所有error信息 --> <RollingFile name="ERROR_LOG" fileName="${LOG_PATH}/log-error.log" filePattern="${LOG_PATH}/log-error-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="${FILE_LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!--按大小分--> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <Filters> <!-- 只记录error级别信息 --> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 --> <DefaultRolloverStrategy max="1000"/> </RollingFile> <!--大于5分钟宽带查询接口单独打印--> <RollingFile name="DAYU_LOG" fileName="${LOG_PATH}/log-dayuInfo.log" filePattern="${LOG_PATH}/log-dayuInfo-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="${FILE_LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1, 单位到底是月 天 小时 分钟,根据filePattern配置的日期格式而定,本处的格式为天,则默认为1天--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!--按大小分--> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <Filters> <!-- 只记录info及以上级别信息 --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 --> <DefaultRolloverStrategy max="100"/> </RollingFile> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="INFO_LOG"/> <AppenderRef ref="ERROR_LOG"/> </Root> <!--将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。--> <Logger name="DAYU_LOG" additivity="true" level="INFO"> <!--<appender-ref ref="sendCodeFile" level="INFO" />--> <appender-ref ref="DAYU_LOG" level="INFO" /> </Logger> </Loggers> </Configuration>
运行效果
转 : https://www.cnblogs.com/mcj123/p/16816378.html