SpringBoot2.0基础案例(02):配置Log4j2,实现不同环境⽇志打印本⽂源码: ||
⼀、Log4j2⽇志简介
⽇志打印是了解Web项⽬运⾏的最直接⽅式,所以在项⽬开发中是需要⾸先搭建好的环境。
1、Log4j2特点
1)核⼼特点
相⽐与其他的⽇志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能⾼;并发的特性,减少了死锁的发⽣。
2)性能测试
2、⽇志打印之外观模式
每⼀种⽇志框架都有⾃⼰单独的API,要使⽤对应的框架就要使⽤其对应的API,增加应⽤程序代码和⽇志框架的耦合性。
《阿⾥巴巴Java开发⼿册》,其中有⼀条规范做了『强制』要求:
SLF4J
Java简易⽇志门⾯(Simple Logging Facade for Java,缩写SLF4J),是⼀套包装Logging 框架的界⾯程式,以外观模式实现。
⼆、配置⽇志打印
1、项⽬结构
2、不同环境的⽇志配置
使⽤最直接的⽅式,不同环境加载不同的⽇志配置。
1)开发环境配置
logging:
config: l
2)⽣产环境配置
logging:
config: l
3、Log4j2的配置⽂件
<?xml version="1.0" encoding="UTF-8"?>
<!--monitorInterval:Log4j2 ⾃动检测修改配置⽂件和重新配置本⾝,设置间隔秒数-->log4j2不打印日志
<configuration monitorInterval="5">
<!--⽇志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:
%date表⽰⽇期,%thread表⽰线程名,
%-5level:级别从左显⽰5个字符宽度
%msg:⽇志消息,%n是换⾏符-->
<!-- %logger{36} 表⽰ Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义⽇志存储的路径,不要配置相对路径 -->
<property name="FILE_PATH" value="E:/logs/dev" />
<property name="FILE_NAME" value="boot-log4j2" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出⽇志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--⽂件会打印出所有信息-->
<File name="Filelog" fileName="${FILE_PATH}/log4j2.log" append="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次⼤⼩超过size,则这size⼤⼩的⽇志会⾃动存⼊按
年份-⽉份建⽴的⽂件夹下⾯并进⾏压缩,作为存档-->        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性⽤来指定多久滚动⼀次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同⼀⽂件夹下15个⽂件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息,每次⼤⼩超过size,则这size⼤⼩的⽇志会⾃动存⼊按年份-⽉份建⽴的⽂件夹下⾯并进⾏压缩,作为存档-->        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%">            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性⽤来指定多久滚动⼀次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同⼀⽂件夹下15个⽂件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息,每次⼤⼩超过size,则这size⼤⼩的⽇志会⾃动存⼊按年份-⽉份建⽴的⽂件夹下⾯并进⾏压缩,作为存档-->        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%">            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性⽤来指定多久滚动⼀次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同⼀⽂件夹下15个⽂件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点⽤来单独指定⽇志的形式,⽐如要为指定包下的class指定不同的⽇志级别等。-->
<!--然后定义loggers,只有定义了logger并引⼊的appender,appender才会⽣效-->
<loggers>
<!--过滤掉spring和mybatis的⼀些⽆⽤的DEBUG信息-->
<logger name="batis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false,则⼦Logger 只会在⾃⼰的appender⾥输出,⽽不会在⽗Logger 的appender⾥输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
三、测试⽇志打印
1、简单的测试程序
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Log4j2Controller {
private static final Logger LOGGER = Logger(Log4j2Controller.class);
/**
* ⽇志级别
* OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
*/
@RequestMapping("/printLog")
public String printLog (){
<("ERROR 级别⽇志");
LOGGER.warn("WARN 级别⽇志");
LOGGER.info("INFO 级别⽇志");
LOGGER.debug("DEBUG 级别⽇志");
return "success" ;
}
}
2、测试效果图
四、源代码
GitHub·地址
github/cicadasmile/spring-boot-base GitEE·地址
gitee/cicadasmile/spring-boot-base