<!--注意spring-boot-starter 去掉自带的logging,下面会配置log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<!--log4j2异步AsyncLogger需要这个依赖,否则AsyncLogger日志打印不出来-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="OFF" monitorInterval="30">
<!--配置文件中变量值,下面会用到-->
<Properties>
<Property name="LOG_HOME">../logs</Property>
</Properties>
<!--Appenders 输出源,可以简单理解为配置要写到哪里怎么写-->
<!--Loggers 日志分根器,可以简单理解为配置哪些信息写到哪些append里-->
<Appenders>
<!--target="SYSTEM_OUT" 表示输出到终端-->
<Console name="STDOUT" target="SYSTEM_OUT">
<!--筛选过滤,要打印到当前appender的日志信息 如果满足level的接收,不满足的拒绝-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--输出格式布局,每个转换说明符以百分号(%)开头,'%'后面的转换字符有如下:-->
<!--
p (level) 日志级别
c(logger) Logger的Name
C (class) Logger调用者的全限定类名 ***
d (date) 日期
highlight 高亮颜色
l (location) 调用位置 ***
L (line) 行号
m (msg/message) 输出的内容
M (methode) 调用方法 ***
maker marker的全限定名
n 输出平台相关的换行符,如'\n' '\r\n'
pid (processId) 进程ID
level (p)日志级别
r JVM启动后经过的微秒
t (tn/thread/threadName) 线程名称
T (tid/threadId) 线程ID
tp (threadPriority) 线程优先级
x (NDC) 线程Context堆栈
-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />
</Console>
<!--滚动文件-->
<!--filePattern 指定当发生Rolling时,文件的转移和重命名规则-->
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/log.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log">
<!-- 只接受level为INFO以上的日志 -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志信息输出格式-->
<!--注意:%M %L 所在的appender如果是AsyncLogger异步Logger的输出源的话,只有当AsyncLogger设置了includeLocation="true"才会显示
但是,这样会降低日志输出的性能(it can make logging 5 - 20 times slower),
所以,如果注重性能这里就不要打印日志的行数和所在方法
-->
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss.SSS} [%t] %-5level - %msg - [%logger{36} %M %L ] %n"/>
<Policies>
<!--
这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log,
最小的时间粒度是dd,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每一天生成一个新文件。
如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件
-->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<!--指定当文件体积大于size指定的值时,触发Rolling-->
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
<!-- 最大保留10个文件 -->
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<!--日志级别level以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--日志信息 优先让 子类Logger匹配 -->
<!--Logger 父子Logger区分,举个粟子 name为"a"的Logger 是 name为"a.b"的父Logger,
而Root的name是"" 所以Root是所有Logger的父Logger(LogManager.ROOT_LOGGER_NAME="")-->
<!--Logger name="serverlogger"表示捕获日志信息name为serverlogger或serverlogger.xxx的信息,
子类Logger捕获了日志信息不会再被父Logger捕获,即使子类捕获日志信息由于level不满足不会去打印这条日志信息。-->
<!--注意 Logger 的 additivity 传递性,默认true
当additivity="true"时,表示当Logger捕获到日志信息并且日志信息的level大于等于当前Logger的属性level,
日志信息会打印到该Logger所有的appender中包括它的所有父logger的appender(不会管父logger的级别如何),
所以呢,如果Logger的additivity不设置"false"的话,很有可能会出现重复打印的哦-->
<!--AsyncLogger 异步记录日志,Log4j2中的AsyncLogger的内部使用了Disruptor框架,所以需要添加依赖disruptor-3.3.4-->
<!--注意:includeLocation="true" 可以解决 AsyncLogger异步Logger输出appender中的日志 类方法和行数信息显示不出来问题,
但是会降低性能(it can make logging 5 - 20 times slower),
所以呢 注重性能这里就不显示打印日志的行数和所在方法,把这里的includeLocation="true 去掉。
AsyncLogger 的additivity属性需要设置为false,这个异步需要依赖disruptor3.4,
如果没有disruptor3.4依赖包,AsyncLogger日志会打印不出来
-->
<AsyncLogger name="serverlogger" level="debug" additivity="false" includeLocation="true">
<!--被当前Logger捕获到的日志信息level大于等于当前Logger的level属性时写入到 RollingFileInfo 里-->
<!--每个Logger 可以设置多个appender ,如果有多个appender 会写入每个appender里-->
<appender-ref ref="RollingFileInfo"/>
</AsyncLogger>
<!--这是 同步记录日志写法-->
<Logger name="org.apache.ibatis" level="DEBUG" additivity="false">
<AppenderRef ref="STDOUT" />
</Logger>
<!--Root 的name="" , 是所有其他配置的Logger的父Logger-->
<!--如果 Root的level="DEBUG",而且没有设置子类捕获过滤如"org"之类的日志信息的话,会发现控制台会打印非常多的调试信息-->
<!--解决办法提高Root的level级别,或者设置子类Logger去捕获过滤相关不想要打印的日志信息,注意level级别给低点,并且设置additivity="false",
如上面的Logger org.apache.ibatis-->
<Root level="info" ><!--这是 同步日志-->
<appender-ref ref="STDOUT" />
</Root>
<!--注: 防止 Log4j2 退出时报OOME
1 混合异步和同步Logger;root logger 为同步,其它为异步(如果additivity为false同步也行)
2 AsyncLogger 的additivity属性设置为false
-->
</Loggers>
</Configuration>
application.properties
##设置log4j2加载的配置文件,如果没有设置的话,默认找classpath:log4j2.xml
#logging.config=classpath:log4j2.xml
链接:https://pan.baidu.com/s/1GNUT-td1dH-l-Vl-W4U5TA
提取码:wev5