log4j2的配置,不同级别日志保存在不同文件夹(基于Springboot)
1.前言汇总
- 目的是想按照按照规定的格式打印在控制台,以及以文件的形式保存下来,并且按照日志的级别,保存为不同的log文件.
- 首先你得搭建一个简单的springboot项目,这个就直接在网上查,例子数不胜数
- 然后在pom.xml文件中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加log4j的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
- 至于为什么要加上exclusions那一段标签,原因是因为springboot有个默认的日志,叫logback,
其实这个日志也是比较好用的,可以看我的下篇文章阐述;所以要把他排除,不然也许会报出错误。 - 然后是在resources目录下加入日志的配置文件,至于名字,在log4j2里,配置文件检测的过程如下:
- log4j会检测名为"log4j.configurationFile"的系统属性值,如果这个值被设置了,则会尝试通过ConfigurationFactory来加载这个值对应的文件。
- 否则它会尝试查找log4j2-test.properties这个文件。
- 否则它会尝试查找文件log4j2-test.yaml 和 log4j2-test.yml。
- 否则它会尝试查找文件log4j2-test.json 和 log4j2-test.jsn。
- 否则查找文件log4j2-test.xml。
- 否则查找文件log4j2.properties。
- 否则查找文件log4j2.yaml 和 log4j2.yml。
- 否则查找文件log4j2.json 和 log4j2.jsn。
- 否则查找文件log4j2.xml。
2.log4j2.xml的实际配置
- 这里我直接po出整个log4j2.xml吧,详细的解释我就直接写在配置文件中的注释了吧
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.example.baseframe.myspringboot.config">
<Properties>
<property name="Log_Home">d:/logs/myspringboot/</property>
</Properties>
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch),ACCEPT(接受其及以上),DENY(拒绝以下),NEUTRAL(中立,由下一个ThresholdFilter处理)-->
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
<!--输出日志格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
</Console>
<!--这个会只打印出所有的DEBUG信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile_Debug" fileName="${Log_Home}/debug/debug.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
<!-- 日志文件大小 -->
<SizeBasedTriggeringPolicy size="20MB" />
<!-- 最多保留文件数 -->
<DefaultRolloverStrategy max="20"/>
<!--至于为什么只会打印出DEBUG级别的日志,就是因为下面的Filters标签,
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的-->
<Filters>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!--这个会只打印出所有的INFO信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile_Info" fileName="${Log_Home}/info/info.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
<SizeBasedTriggeringPolicy size="20MB" />
<DefaultRolloverStrategy max="20"/>
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!--这个会只打印出所有的WARN信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile_Warn" fileName="${Log_Home}/warn/warn.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
<SizeBasedTriggeringPolicy size="20MB" />
<DefaultRolloverStrategy max="20"/>
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!--这个会只打印出所有的ERROR信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile_Error" fileName="${Log_Home}/error/error.log" filePattern="${Log_Home}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}| %-5level|%ip|%thread| %logger{50}| %msg%n" />
<SizeBasedTriggeringPolicy size="20MB" />
<DefaultRolloverStrategy max="20"/>
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
</appenders>
<Loggers>
<!--然后定义logger,只有定义了logger并引入的appender,
appender才会生效,additivity默认是true,表示将此logger的打印信息向上级传递,
在这儿root就是他的上级,root的设置的打印级别是debug,logger级别没有低于他,
所以root里面也会打印一遍-->
<logger name="com.example.baseframe.myspringboot" level="DEBUG" additivity="true">
<AppenderRef ref="RollingFile_Debug" />
<AppenderRef ref="RollingFile_Info" />
<AppenderRef ref="RollingFile_Warn" />
<AppenderRef ref="RollingFile_Error" />
</logger>
<!--建立一个默认的root的logger-->
<root level="DEBUG">
<AppenderRef ref="Console" />
</root>
</Loggers>
</Configuration>
public class Log4j2DemoApplication implements ApplicationRunner {
private static final Logger logger = LogManager.getLogger(Log4j2DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(Log4j2DemoApplication.class, args);
}
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
logger.debug("Debugging log");
logger.info("Info log");
logger.warn("Hey, This is a warning!");
logger.error("Oops! We have an Error. OK");
logger.fatal("Damn! Fatal error. Please fix me.");
}
}