Spring Boot微服務專案實戰(第2版)學習筆記-第8章整合Log4J日誌
整合Log4J日誌
本章主要回顧Log4J的基礎知識、在Spring Boot中整合Log4J、Log4J在Spring Boot中的運用以及如何把日誌列印到控制檯和記錄到日誌檔案中等內容。
Spring Boot支援Java Util Logging、Log4J2及Lockback作為日誌框架,如果你使用Starters啟動器,Spring Boot將使用Logback作為預設日誌框架。
Log4J概述
Log4J是Apache下的一個開源專案,通過使用Log4J可以將日誌資訊列印到控制檯、檔案等,也可以控制每一條日誌的輸出格式,通過定義每一條日誌資訊的級別,更加細緻地控制日誌的生成過程。
在應用程式中新增日誌記錄有3個目的:
- 監視程式碼中變數的變化情況,週期性地記錄到檔案中供其他應用進行統計分析工作。
- 跟蹤程式碼執行時軌跡,作為日後審計的依據。
- 擔當整合開發環境中的偵錯程式的作用,向檔案或控制檯列印程式碼的除錯資訊。
Log4J中有3個主要的元件,它們分別是:Logger(記錄器)、Appender(輸出源)和Layout(佈局),這3個元件可以簡單地理解為日誌類別、日誌要輸出的地方和日誌以何種形式輸出。Log4J的原理如圖所示。
- Logger(記錄器):Logger元件被分為7個級別:all、debug、info、warn、error、fatal、off。這7個級別是有優先順序的,即:all<debug< info< warn<error< fatal<off
- Appender(輸出源):Log4J日誌系統允許把日誌輸出到不同的地方,如控制檯(Console)、檔案(Files)等,可以根據天數或者檔案大小產生新的檔案,可以以流的形式傳送到其他地方等。
- Layout(佈局):Layout的作用是控制Log資訊的輸出方式,也就是格式化輸出的資訊。
Log4J支援兩種配置檔案格式:一種是XML格式的檔案;另一種是Java特性檔案log4J2.properties(鍵=值)。XML檔案可以配置更多的功能(如過濾),properties檔案簡單易讀,沒有好壞,能夠融會貫通就是最好的。具體的XML配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d(HH:mm:ss.SSS) [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
整合Log4J2
引入依賴
在Spring Boot中整合Log4J2,首先需要在pom.xml檔案中引入所需的依賴,具體程式碼如下:
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
Spring Boot預設使用Logback日誌框架來記錄日誌,並用INFO級別輸出到控制檯,所以我們在引入Log4J2之前,需要先排除該包的依賴,再引入Log4J2的依賴。具體做法是,找到pom.xml檔案中的spring-boot-starter-web依賴,使用exclusion標籤排除Logback,具體排除Logback依賴的程式碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除Spring Boot預設日誌-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
新增Log4J配置
Log4J2支援兩種配置檔案格式:一種是XML格式的檔案;另一種是properties檔案的格式。這裡使用XML格式配置Log4J2,properties格式可以作為大家的自學任務。使用XML格式配置很簡單,只需要在application.properties檔案中新增如下的配置資訊:
### Log4J配置
logging.config=classpath:log4j2.xml
配置完成之後,Spring Boot就會幫我們在classpath路徑下查詢log4j2.xml檔案,所以最後一步,只需要配置好log4j2.xml檔案即可。
建立log4j2.xml檔案
application.properties配置完成之後,在目錄/src/main/resources下新建空的日誌配置檔案log4j2.xml。具體程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<Confiquration status-"WARN">
<appenders>
</appenders>
<loggers>
<root level="all">
</root>
</loggers>
</Configuration>
使用Log4J記錄日誌
列印到控制檯
現在我們需要把日誌列印到控制檯,需要往log4j2.xml配置檔案新增相關的配置,具體程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<Confiquration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--指定日誌的輸出格式-->
<PatternLayout pattern="[%d(HH:mm:ss:SSS}] [%p] - %l- %m%n"/>
</Console>
</appenders>
<loggers>![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20210315193706669.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZXphcHBsZQ==,size_16,color_FFFFFF,t_70)
<root level="info">
<!-控制檯輸出-->
<appender-ref ref="Console"/>
</root>
</loggers>
</Configuration>
- <Console/>:指定控制檯輸出。
- <PatternLayout/>:指定日誌的輸出格式。
Spring Boot整合Log4J日誌完成之後,在第6和第七章中,我們已經開發好AyUserListener監聽器,但是使用System.out.println來列印資訊是一種非常不合理的方式,現在我們把Logger類引入到AyUserListener.java監聽器中,同時把System.out.println相關程式碼註釋掉,改成用日誌方式記錄資訊。這樣,在專案啟動過程中,呼叫上下文初始化和銷燬方法的時候,就會記錄日誌到開發工具控制檯或者日誌檔案中。AyUserListener具體程式碼如下:
@WebListener
public class AyUserListener implements ServletContextListener{
//省略程式碼
//需要新增的程式碼
Logger logger = LogManager.getlogger(this.getclass());
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//查詢資料庫所有的使用者
List<AyUser> ayuserList = ayUserse.findAll();
//清除快取中的使用者資料
redisTemplate.delete(ALL_USER);
//存放到 Redis快取中
redisTemplate.opsForList().leftPushAll(ALL_USER, ayUserList);
//真實專案中需要註釋
List<AyUser> queryUserList = redisTexplate.opsForList().range(ALL_USER,0,-1);
//Syatem.out.println("快取中目前的使用者數有:"+ queryUserList.size()+"人");
//System.out.printIn("ServletContext上下文初始化");
logger.info("ServletContext上下文初始化");
logger.info("快取中目前的使用者數有: "+queryUserList.size()+"人");
}
@Override
public void context Destroyed(ServletContextEvent servletContextEvent){
//System.out.println("Servletcontex上下文銷燬");
logger.info("ServletContext上下文銷燬");
}
}
記錄到檔案
上線環境中,專案的日誌都是被記錄到檔案中的。我們繼續在log4j2.xml配置檔案中新增相關配置,使日誌可以被列印到檔案中,具體程式碼如下:
<?xml version="1.0" encoding="UTF-8">
<Configuration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<!--設定日誌輸出的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</Console>
<RollingFile name="RollingFileInfo" fileName="D:/info.log"
filePattern="D:/$${date:yyyy-MM}/info-%d{yyyy-MM-dd} -%i.log">
<Filters>
<ThresholdFilter level="INFO"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPol1icy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>
</loggers>
</Configuration>
- <RollingFile>標籤:fileName用於定義日誌的資料路徑,如D:/info.log。filePattern定義日誌的匹配方式。
- <Filters>標籤:日誌過濾策略,標籤用於指定日誌資訊的最低輸出級別,預設為DEBUG。
現在修改AyUserServiceImpl類的刪除方法Delete,我們希望刪除使用者這個操作可以被記錄到日誌檔案中,AyUserServiceImpl類程式碼具體的修改如下:
//@Transactional
@Service
public class AyUserServiceImpl implements AyUserService {
//省略程式碼
//需要新增的程式碼
Logger logger = LogManager.getLogger(this.getclass());
@Override
public void delete(String id){
ayUserRepository.delete():
//需要新增的程式碼
logger.info("userId:"+id+"使用者被刪除");
}
//省略程式碼
}
測試
程式碼開發完成之後,接下來就是測試工作了。重新啟動專案,啟動之前,記得開啟Redis伺服器,因為之前的章節已經在Spring Boot中整合了Redis,專案重啟的過程中,可以在Intellij IDEA控制檯中看到如圖所示的資訊。同時,我們可以到D盤檢視日誌檔案info.log,在日誌檔案中按住Ctrl+F鍵,可以查詢到和圖所示一樣的資訊。
接著,再測試一下刪除使用者的時候,日誌是否可以列印到控制檯或者記錄到日誌檔案中。在測試類DemoApplicationTests下新增測試用例,具體程式碼如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests{
//省略程式碼
Logger logger = LogManger.getLogger(this.getClass());
@Test
public void testLog4j(){
ayUserService.delete("4");
logger.info("delete success!!!");
}
}
在資料庫ay_test表中存在4條資料。執行單元測試方法testLog4J,如果同樣可以在Intellij IDEA控制檯或者D盤的info.log檔案中列印,證明SpringBoot整合Log4J以及在Spring Boot中運用Log4J成功。
Tips:啟動專案的時候,記得啟動Redis伺服器,否則會報錯。