1. 程式人生 > 其它 >Spring Boot微服務專案實戰(第2版)學習筆記-第8章整合Log4J日誌

Spring Boot微服務專案實戰(第2版)學習筆記-第8章整合Log4J日誌

整合Log4J日誌

本章主要回顧Log4J的基礎知識、在Spring Boot中整合Log4J、Log4J在Spring Boot中的運用以及如何把日誌列印到控制檯和記錄到日誌檔案中等內容。

Spring Boot支援Java Util LoggingLog4J2Lockback作為日誌框架,如果你使用Starters啟動器,Spring Boot將使用Logback作為預設日誌框架。

Log4J概述

Log4J是Apache下的一個開源專案,通過使用Log4J可以將日誌資訊列印到控制檯、檔案等,也可以控制每一條日誌的輸出格式,通過定義每一條日誌資訊的級別,更加細緻地控制日誌的生成過程。

在應用程式中新增日誌記錄有3個目的:

  1. 監視程式碼中變數的變化情況,週期性地記錄到檔案中供其他應用進行統計分析工作。
  2. 跟蹤程式碼執行時軌跡,作為日後審計的依據。
  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
    ,分別用來指定這條日誌資訊的重要程度。Log4J有一個規則——只輸出級別不低於設定級別的日誌資訊。假設Logger級別設定為info,則info、warn、error和fatal級別的日誌資訊都會輸出,而級別比info低的debug則不會輸出。Log4J允許開發人員定義多個Logger,每個Logger擁有自己的名字,Logger之間通過名字來表明隸屬關係。
  • 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伺服器,否則會報錯。