收到大哥的一个要求:要用log4j2来记录开发过程中产生的信息,并以天为单位,保存日志文件;七天为一个周期。
听到这个需求,心里直打鼓,怎么做啊;
学习了一圈下来以后,也算是完成了这个任务安排;
乘机写下这篇博文,记录自己的实操过程,仅当复盘思路整理使用;
log4j2 一个用来记录操作过程,并汇总成日志的东西,同类的产品还有logback、log4j;
为什么选择log4j2?
因为快、可靠、丢记录丢的少;好,打住,不继续深入。
怎么在springboot项目中集成log4j2?
写一个配置文件就好;
配置文件写哪里?
放在resources文件夹下就好,跟springboot的配置文件(application.properties)同级,
文件名称写成log4j2-spring.xml;
这个命名写成这样,就不用去springboot的application.properties里面再配置路径了。偷个懒。
(这里多写两句,做个备注:log4j2的配置文件可以是xml格式的,也可以是properties格式的,也可以是yml格式的,只不过一开始是xml格式的,所以接受度比较广,网上能找到的用xml来配置的资料也比较多)
在用log4j2的时候,在pom文件里引入依赖,不过springboot的“web启动”依赖里面也带了日志记录的工具logging,所以在引入依赖的时候,要把“web启动”依赖里面的logging摘出来。
否则会报依赖冲突,有复数的可以用来记录、生成的日志的工具,咱们的程序不知道要用哪一个。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--刨去spring本身的日志记录配置-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入log4j2日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--刨去spring本身的日志记录配置-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
pom文件中有提到一个叫slf4j的东西,这个就是log4j2的门面啦,就相当于管家一样的角色,在lombok这个插件里面,有用到一个叫@slf4j的注解,一般打在【类】上头,就表明给这个【类】提供一个用来记录日志的对象--log;一般是可以直接使用的,非常方便。
依赖导入好了,就可以开始写log4j2的配置文件了。
log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<properties>
<!-- 基础配置:文件的名称、日志的输出路径、字符集、输出格式-->
<Property name="appName">personal_program</Property>
<property name="logPath">D:\personalProgram\personal_program_log</property>
<Property name="logFileCharset">UTF-8</Property>
<property name="logFilePattern">%highlight{%d{yyyy-MM-dd HH:mm:ss} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}</property>
</properties>
<Appenders>
<!-- 日志输出一号:控制台输出 ,日志记录级别:DEBUG; 输出格式:延续基础配置-->
<Console name="ConsoleLog" target="SYSTEM_OUT">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${logFilePattern}" />
</Console>
<!-- 日志输出二号:以文件的形式输出,日志记录级别:ERROR; 输出格式:延续基础配置
文件的生成策略:大小不超过10MB,每天记录;
最大日志文件数量为30;理想情况下是保存一个月内的ERROR报错信息-->
<RollingFile name="FILE_ERROR"
fileName="${logPath}/${appName}_error.log"
filePattern="${logPath}/$${date:yyyy-MM-dd}/${appName}_error_%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${logFilePattern}" charset="${logFileCharset}" />
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
<!-- 以时间为单位的策略;粒度粗细跟【filePattern】里的时间设定有关,
目前是%d{yyyy-MM-dd} ,interval="1",所以时间策略就是每天
如果是%d{yyyy-MM-dd HH-mm} ,interval="1",则时间策略就是每分钟
-->
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<!-- 日志输出三号:以文件的形式输出,日志记录级别:INFO;输出格式:延续基础配置-->
<RollingFile name="FILE_INFO"
fileName="${logPath}/${appName}_info.log"
filePattern="${logPath}/$${date:yyyy-MM-dd}/${appName}_info_%d{yyyy-MM-dd HH-mm}_%i.log.gz">
<!-- 过滤策略,上限WARN,下限INFO-->
<levelRangeFilter minLevel="WARN" maxLevel="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="${logFilePattern}" charset="${logFileCharset}" />
<Policies>
<SizeBasedTriggeringPolicy size="10KB" />
<TimeBasedTriggeringPolicy modulate="true" interval="2" />
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers>
<logger name="com.zaxxer.hikari.pool.PoolBase" level="ERROR"/>
<logger name="com.zaxxer.hikari.pool.HikariPool" level="ERROR"/>
<logger name="com.zaxxer.hikari.HikariDataSource" level="ERROR"/>
<logger name="org.springframework.jdbc.datasource" level="ERROR"/>
<!--根记录器-->
<Root level="debug">
<appender-ref ref="ConsoleLog" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</Root>
</Loggers>
</Configuration>
配置好以后,运行自己的项目,记得打上@slf4j的注解,然后就可以看到效果了。