Springboot2 集成log4j2
在任何定制系統(tǒng)開發(fā)過程中,健全的日志系統(tǒng)是調(diào)試、運(yùn)維、追查故障的重要保障,因?yàn)閘og4j頻頻爆出漏洞,魁鯨科技目前主要使用log4j2這個(gè)組件替代
基礎(chǔ)步驟
- Spring Boot默認(rèn)使用的是logback框架,因此需要排除
spring-boot-starter-logging - 然后引入log4j2框架
- 配置文件設(shè)置使用log4j2的配置路徑
- 程序代碼種使用日志門面slf4j框架打印日志。
修改pom.xml文件
在spring-boot-starter-web種排除默認(rèn)的logging包
<!-- springboot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
通過依賴樹排除第三方的框架內(nèi)對(duì)logback等沖突包的依賴


找到并排除

在resource目錄下新增log4j2的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,這個(gè)用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時(shí),你會(huì)看到log4j2內(nèi)部各種詳細(xì)輸出--> <!--monitorInterval:Log4j能夠自動(dòng)檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration status="WARN" monitorInterval="30"> <!-- 配置日志文件輸出目錄,此配置將日志輸出到tomcat根目錄下的指定文件夾 -->
<properties>
<property name="LOG_HOME">./WebAppLogs/logs</property>
</properties>
<!--先定義所有的appender-->
<appenders> <!-- 優(yōu)先級(jí)從高到低分別是 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL -->
<!-- 單詞解釋: Match:匹配 DENY:拒絕 Mismatch:不匹配 ACCEPT:接受 -->
<!-- DENY,日志將立即被拋棄不再經(jīng)過其他過濾器; NEUTRAL,有序列表里的下個(gè)過濾器過接著處理日志; ACCEPT,日志會(huì)被立即處理,不再經(jīng)過剩余過濾器。 -->
<!--輸出日志的格式 %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生產(chǎn)時(shí)間 %p : 日志輸出格式 %c : logger的名稱 %m : 日志內(nèi)容,即 logger.info("message") %n : 換行符 %C : Java類名 %L : 日志輸出所在行數(shù) %M : 日志輸出所在方法名 hostName : 本地機(jī)器名 hostAddress : 本地ip地址 -->
<!--這個(gè)輸出控制臺(tái)的配置-->
<console name="Console" target="SYSTEM_OUT"> <!--輸出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{1.} - %m%n"/>
<!--<PatternLayout pattern="[%d{HH:mm:ss:SSS}] - (%F:%l) - %m%n"/>-->
<!--<PatternLayout pattern="[%d{HH:mm:ss:SSS}] (%F:%L) %m%n" />-->
</console>
<!-- 這個(gè)會(huì)打印出所有的info及以下級(jí)別的信息,每次大小超過size,則這size大小的日志會(huì)自動(dòng)存入按年份-月份建立的文件夾下面并進(jìn)行壓縮,作為存檔-->
<!-- TRACE級(jí)別日志 ; 設(shè)置日志格式并配置日志壓縮格式,壓縮文件獨(dú)立放在一個(gè)文件夾內(nèi), 日期格式不能為冒號(hào),否則無法生成,因?yàn)槲募辉试S有冒號(hào),此appender只輸出trace級(jí)別的數(shù)據(jù)到trace.log -->
<RollingFile name="RollingFileTrace" immediateFlush="true" fileName="${LOG_HOME}/trace.log"
filePattern="${LOG_HOME}/trace_%d{yyyy-MM-dd-HH}-%i.log.zip">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件,這里設(shè)置了20 -->
<DefaultRolloverStrategy max="20">
<!--這里的age必須和filePattern協(xié)調(diào), 后者是精確到HH, 這里就要寫成xH, xd就不起作用 另外, 數(shù)字最好>2, 否則可能造成刪除的時(shí)候, 最近的文件還處于被占用狀態(tài),導(dǎo)致刪除不成功!-->
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="trace_*.zip"/>
<!-- 保存時(shí)間與filePattern相同即可 -->
<!-- 如果filePattern為:yyyy-MM-dd-HH:mm:ss, age也可以為5s,表示日志存活時(shí)間為5s -->
<IfLastModified age="168H"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileDebug" immediateFlush="true" fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/debug_%d{yyyy-MM-dd-HH}-%i.log.zip">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="debug_*.zip"/>
<IfLastModified age="168H"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile> <!-- info日志配置 -->
<RollingFile name="RollingFileInfo" immediateFlush="true"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/info_%d{yyyy-MM-dd-HH}-%i.log.zip"> <!--控制臺(tái)只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter
level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="info_*.zip"/>
<IfLastModified age="168H"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile> <!-- warn日志配置 -->
<RollingFile name="RollingFileWarn"
immediateFlush="true"
fileName="${LOG_HOME}/warn.log" filePattern="${LOG_HOME}/warn_%d{yyyy-MM-dd-HH}-%i.log.zip">
<ThresholdFilter
level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="warn_*.zip"/>
<IfLastModified age="168H"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile> <!-- error日志配置 -->
<RollingFile
name="RollingFileError" immediateFlush="true"
fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error_%d{yyyy-MM-dd-HH}-%i.log.zip">
<ThresholdFilter
level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20">
<Delete basePath="${LOG_HOME}" maxDepth="2">
<IfFileName glob="error_*.zip"/>
<IfLastModified age="168H"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders> <!--然后定義logger,只有定義了logger并引入的appender,appender才會(huì)生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
<logger name="org.springframework" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileTrace"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
配置application.yml
server:
port: 8080
spring:
banner:
charset: utf-8
logging:
level:
# 根據(jù)不同的類設(shè)定不同級(jí)別
root: info
study.*: debug
nobyte.*: debug
config: classpath:log4j2-spring.xml
使用slf4j打印
package study.springboot.ioc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
* CustomService
*
* @author linkanyway
* @version 1.0
* @date 2022/04/06 20:37
*/
@Component("CustomService")
@Slf4j
public class CustomServiceImpl implements CustomService {
/**
* 構(gòu)造器
*/
public CustomServiceImpl() {
log.debug ("CustomService被實(shí)例化,容器裝配制定了Lazy因此容器裝載時(shí)候不會(huì)立刻初始化,只有第一次調(diào)用才會(huì)初始化");
}
/**
* 重載print方法
*/
@Override
public void print() {
log.debug (this.getClass ().getCanonicalName ()+" 被調(diào)用了print方法");
}
}