配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF -->
<configuration status="OFF">
<!-- 定义下面的引用名 -->
<Properties>
<!--linux目录 /logs -->
<!--<property name="basePath">/logs</property>-->
<property name="basePath">${sys:}/logs/webchat</property>
<property name="rolling_pattern">%d{yyyy-MM-dd}-%</property>
<property name="every_file_size">10MB</property><!-- 日志切割的最小单位 -->
<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n</property>
</Properties>
<!--先定义所有的appender -->
<appenders>
<!--这个输出控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT" >
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<!--这个都知道是输出日志的格式 -->
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
</Console>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<!-- 按月生成归档日志,可以使用 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%" -->
<RollingFile name="RollingFile" fileName="${basePath}/"
filePattern="${basePath}/${rolling_pattern}" >
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<SizeBasedTriggeringPolicy size="${every_file_size}" />
</RollingFile>
<!--fileName 方法日志 -->
<RollingFile name="InterceptorRollingFile" fileName="${basePath}/"
filePattern="${basePath}/${rolling_pattern}" >
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<SizeBasedTriggeringPolicy size="${every_file_size}" />
</RollingFile>
<!--fileName com/sinter/controller/login/ sendCode方法日志 -->
<!-- <File name="sendCodeFile" fileName="${basePath}/" append="false">
<PatternLayout pattern="${log_pattern}"/>
</File>-->
<RollingFile name="sendCodeRollingFile" fileName="${basePath}/" append="true"
filePattern="${basePath}/${rolling_pattern}">
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<Policies>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<!-- 每天凌晨0点 匹配的所有文件在10天或更长时间内将在翻滚时间删除。-->
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${basePath}" maxDepth="2">
<IfFileName glob="*.gz" />
<IfLastModified age="10d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--建立一个默认的root的logger,需要在root的level中指定输出的级别, -->
<root level="INFO" >
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<!--将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。-->
<Logger name="sendCodeLogger" additivity="false" level="INFO">
<!--<appender-ref ref="sendCodeFile" level="INFO" />-->
<appender-ref ref="sendCodeRollingFile" level="INFO" />
</Logger>
<Logger name="interceptorLogger" additivity="false" level="INFO">
<appender-ref ref="InterceptorRollingFile" level="INFO" />
</Logger>
</loggers>
</configuration>
其实主要的是RollingFile标签中的:
<RollingFile name="sendCodeRollingFile" fileName="${basePath}/" append="true"
filePattern="${basePath}/${rolling_pattern}">
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<Policies>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<!-- 每天凌晨0点 匹配的所有文件在10天或更长时间内将在翻滚时间删除。-->
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${basePath}" maxDepth="2">
<IfFileName glob="*.gz" />
<IfLastModified age="10d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
和loggers标签的:
<!--将logger中的 additivity 属性配置为 false,则这个logger不会将日志流反馈到root中。-->
<Logger name="sendCodeLogger" additivity="false" level="INFO">
<!--<appender-ref ref="sendCodeFile" level="INFO" />-->
<appender-ref ref="sendCodeRollingFile" level="INFO" />
</Logger>
使用代码:
static Logger log = ("sendCodeLogger");
("###################ip为: "+ip);
==========================================
SpringBoot的 配置指定包或类输出至单独的日志文件中
分别打印对应日志到指定的目录文件去,如:info去info文件err去err文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- appender是configuration的子节点,是负责写日志的组件。 -->
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="">
<!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
<!--<immediateFlush>true</immediateFlush>-->
<encoder>
<!-- %37():如果字符没有37个字符长度,则左侧用空格补齐 -->
<!-- %-37():如果字符没有37个字符长度,则右侧用空格补齐 -->
<!-- %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 -->
<!-- %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符 -->
<!-- %msg:日志打印详情 -->
<!-- %n:换行符 -->
<!-- %highlight():转换说明符以粗体红色显示其级别为ERROR的事件,红色为WARN,BLUE为INFO,以及其他级别的默认颜色。 -->
<pattern>%d{yyyy-MM-dd HH:mm:} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="info_log" class="">
<!--日志文件路径和名称-->
<File>logs/project_info.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<filter class="">
<level>ERROR</level>
<onMatch>DENY</onMatch><!-- 如果命中ERROR就禁止这条日志 -->
<onMismatch>ACCEPT</onMismatch><!-- 如果没有命中就使用这条规则 -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="">
<!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_info.2017-12-05. -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_info.%d.%</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_error.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="error_log" class="">
<!--日志文件路径和名称-->
<File>logs/project_error.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<!-- ThresholdFilter过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件 -->
<filter class="">
<level>ERROR</level><!-- 低于ERROR级别的日志(debug,info)将被拒绝,等于或者高于ERROR的级别将相应NEUTRAL -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="">
<!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_error.2017-12-05. -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_error.%d.%</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天,
ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender(不用在意level值)。
换句话说,appender是从记录器层次结构中附加地继承的。
例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
如果另外将文件追加器添加到记录器(例如L),则对L和L'子项启用的记录请求将打印在文件和控制台上。
通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积-->
<!-- configuration中最多允许一个root,别的logger如果没有设置级别则从父级别root继承 -->
<root level="INFO">
<!--在控制台打印-->
<appender-ref ref="STDOUT" />
<!--在控制台打印-->
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--定义日志文件的存储地址目录--><!--
<property name="LOG_HOME" value="./USER_QQBK_GA/qqbk/"/>-->
<property name="LOG_HOME" value="./qqbk/"/>
<!-- 日志级别 有高到低 ERROR、WARN、INFO、DEBUG、TRACE -->
<!--输出到控制台-->
<appender name="console" class="">
<!--<filter class="">
<level>DEBUG</level>
</filter>-->
<withJansi>true</withJansi>
<encoder>
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="">
<file>${LOG_HOME}/qbbk_service_operation.log</file> <!-- 日志名称 -->
<filter class="">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="">
<!-- 按分钟分割 文件名2019-10-07[0].log,如果文件大小超过10240kb,则继续分割日志2019-10-07[1].log,
2019-10-07[2].log。%d和%i不能缺少
-->
<fileNamePattern>${LOG_HOME}%d{yyyy-MM-dd}[%i].log</fileNamePattern>
<maxFileSize>10240kb</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符-->
<!--<pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="debugfile"
class="">
<file>${LOG_HOME}/qbbk_service_debug.log</file>
<!--<filter class="">
<level>DEBUG</level>
</filter>-->
<!-- 配置日志所生成的目录以及生成文件名的规则 在logs/mylog-2017-06-31. -->
<rollingPolicy class="">
<fileNamePattern>${LOG_HOME}/qbbk_service_debug.%d{yyyy-MM-dd}.%</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为30天,30天之前的都将被清理掉 -->
<maxHistory>30</maxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10 GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy
class="">
<!--文件达到 最大128MB时会被压缩和切割 -->
<maxFileSize>128 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %.-5level %class{25} - %msg%n</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="sysfile" class="">
<file>${LOG_HOME}/qbbk_service_system.log</file> <!-- 日志名称 -->
<!--<filter class="">
<level>INFO</level>
</filter>-->
<rollingPolicy class="">
<!-- 按分钟分割 文件名2019-10-07[0].log,如果文件大小超过10240kb,则继续分割日志2019-10-07[1].log,
2019-10-07[2].log。%d和%i不能缺少
-->
<fileNamePattern>${LOG_HOME}/qbbk_service_system.%d{yyyy-MM-dd}.%</fileNamePattern>
<maxFileSize>10240kb</maxFileSize>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符-->
<!--<pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
<pattern>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--==============================单独类日志输出方式=============================-->
<!-- log info start -->
<appender name="demo-info" class="">
<file>${LOG_HOME}/</file>
<rollingPolicy class="">
<fileNamePattern>${LOG_HOME}/aa.%d{yyyy-MM-dd}.%</fileNamePattern>
<!-- 如果按天来回滚,则最大保存时间为30天,30天之前的都将被清理掉 -->
<maxHistory>30</maxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10 GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy
class="">
<!--文件达到 最大128MB时会被压缩和切割 -->
<maxFileSize>128 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="">
<layout class="">
<pattern>%msg%n</pattern>
</layout>
</encoder>
<!--日志文件最大的大小 -->
<triggeringPolicy class="">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--对应类的路径地址 -->
<logger name="" level="DEBUG">
<appender-ref ref="demo-info" />
</logger>
<!--==========================单独类日志输出方式结束===============================-->
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
<appender-ref ref="sysfile" />
<appender-ref ref="debugfile" />
<!-- 将我们新增的配置添加进root中统一设置输出级别 -->
</root>
<!-- 指定文件,日志级别和输出路径 -->
<logger name="" level="info" additivity="false">
<appender-ref ref="console" />
</logger>
</configuration>
使用:
public class LogsUtils {
private final static Logger LOGGER = ();
("惺惺惜惺惺想寻寻寻寻");
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/"/>
<include resource="org/springframework/boot/logging/logback/"/>
<property name="LOG_HOME" value="C:\log"/>
<property name="LOG_PREFIX" value="web-xxx"/>
<!--
%p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r:输出自应用启动到输出该日志讯息所耗费的毫秒数
%t:输出产生该日志事件的线程名
%f:输出日志讯息所属的类别的类别名
%c:输出日志讯息所属的类的全名
%d:输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}
%l:输出日志事件的发生位置,即输出日志讯息的语句在他所在类别的第几行。
%m:输出代码中指定的讯息,如log(message)中的message
%n:输出一个换行符号
-->
<!--
Appender: 设置日志信息的去向,常用的有以下几个
(控制台)
(文件大小到达指定尺寸的时候产生一个新文件)
(文件,不推荐使用)
-->
<appender name="FILE" class="">
<!--<!– 被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建
–>-->
<!--必须要,不然没法生成日期的目录-->
<Prudent>true</Prudent>
<File>${LOG_HOME}/${LOG_PREFIX}-</File>
<!--<encoder>:对记录事件进行格式化。-->
<encoder>
<!--格式化输出:%d表示日期,后面跟时间格式,默认%data{yyyy-MM-dd},%thread表示线程名,
%msg:日志消息,%n是换行符-->
<pattern>%date [%level] [%thread] %logger{60} [%file : %line] %msg%n</pattern>
</encoder>
<!--RollingFileAppender:-->
<!--滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<!--<rollingPolicy>:当发生滚动时,决定RollingFileAppender 的行为,涉及文件移动和重命名。-->
<!--TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
<rollingPolicy class="">
<!--<fileNamePattern>:
必要节点,包含文件名及“%d”转换符, “%d”可以包含一个 指定的时间格式,
如:%d{yyyy-MM}。
如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file字节点可有可无,通过设置file,
可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;
如果没设置file,活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次。“/”或者“\”
会被当做目录分隔符。-->
<!--<fileNamePattern>${LOG_HOME}/daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>-->
<!--压缩文件的保存路径以及保存格式,这里必须将文件压缩,.%i 必须有。如果按上面的配置会报错-->
<fileNamePattern>${LOG_HOME}/daily/${LOG_FILE}_%d{yyyy-MM-dd}.log.%</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="">
<!--保存文件的大小,超过该大小自动创建新文件。旧文件压缩保存到daily目录下-->
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--超过1的直接天删除-->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!--<!– 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,
如果是6,则只保存最近6天的文件,删除之前的旧文件 包括压缩文件 –>-->
<!--<!– 每产生一个日志文件,该日志文件的保存期限天数 –>-->
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender>
<!--root是默认的logger 这里设定输出级别是info-->
<root level="INFO">
<!--定义了两个appender,日志会通过往这两个appender里面写-->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- appender是configuration的子节点,是负责写日志的组件。 -->
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="">
<!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
<!--<immediateFlush>true</immediateFlush>-->
<encoder>
<!-- %37():如果字符没有37个字符长度,则左侧用空格补齐 -->
<!-- %-37():如果字符没有37个字符长度,则右侧用空格补齐 -->
<!-- %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 -->
<!-- %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符 -->
<!-- %msg:日志打印详情 -->
<!-- %n:换行符 -->
<!-- %highlight():转换说明符以粗体红色显示其级别为ERROR的事件,红色为WARN,BLUE为INFO,以及其他级别的默认颜色。 -->
<pattern>%d{yyyy-MM-dd HH:mm:} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="info_log" class="">
<!--日志文件路径和名称-->
<File>logs/project_info.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<filter class="">
<level>ERROR</level>
<onMatch>DENY</onMatch><!-- 如果命中ERROR就禁止这条日志 -->
<onMismatch>ACCEPT</onMismatch><!-- 如果没有命中就使用这条规则 -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="">
<!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_info.2017-12-05. -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_info.%d.%</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_error.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="error_log" class="">
<!--日志文件路径和名称-->
<File>logs/project_error.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<!-- ThresholdFilter过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件 -->
<filter class="">
<level>ERROR</level><!-- 低于ERROR级别的日志(debug,info)将被拒绝,等于或者高于ERROR的级别将相应NEUTRAL -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="">
<!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_error.2017-12-05. -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_error.%d.%</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender(不用在意level值)。
换句话说,appender是从记录器层次结构中附加地继承的。
例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
如果另外将文件追加器添加到记录器(例如L),则对L和L'子项启用的记录请求将打印在文件和控制台上。
通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积-->
<!-- configuration中最多允许一个root,别的logger如果没有设置级别则从父级别root继承 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="" level="INFO">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
<!-- 利用logback输入mybatis的sql日志,
注意:如果不加 additivity="false" 则此logger会将输出转发到自身以及祖先的logger中,就会出现日志文件中sql重复打印-->
<logger name="" level="DEBUG" additivity="false">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
<!-- additivity=false代表禁止默认累计的行为,即中的日志只会记录到日志文件中,不会输出层次级别更高的任何appender-->
<logger name="" level="INFO" additivity="false">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
</configuration>