後臺程序開發及上線時,一般都會用到Log信息打印及Log日誌記錄,開發時通過Log信息打印可以快速的定位問題所在,幫助我們快捷開發。程序上線後如遇到Bug或錯誤,此時則需要日誌記錄來查找發現問題所在。springboot構建微服務工程可以使用很多不同的日誌系統,如logback,log4j,log4j2等,其中最常用的Apache Log4j,而Log4j 2是Log4j的升級版本,Log4j 2相對於Log4j 1.x 有了很多顯著的改善。本章內容就着重介紹微服務工程中log4j2的使用。
一.接入步驟:
1.pom引入Log4j2 Starter disruptor依賴
<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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency>
2.添加log4j2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,
你會看到log4j2內部各種詳細輸出。可以設置成OFF(關閉)或Error(只輸出錯誤信息)
-->
<Configuration status="debug">
<Properties>
<Property name="App">demo</Property>
<Property name="logDir">logs</Property>
<Property name="splitSize">30 MB</Property>
</Properties>
<Appenders>
<!-- 輸出控制檯日誌的配置 -->
<Console name="console" target="SYSTEM_OUT">
<!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 輸出日誌的格式 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 打印出所有的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔 -->
<RollingRandomAccessFile name="infoLog" fileName="${logDir}/${App}-info.log" immediateFlush="false"
filePattern="${logDir}/$${date:yyyy-MM}/${App}-info-%d{MM-dd-yyyy}-%i.log.gz"
append="true">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} [%t] %-5level %logger{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="${splitSize}"/>
</Policies>
<Filters>
<!-- 只記錄info和warn級別信息 -->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 指定每天的最大壓縮包個數,默認7個,超過了會覆蓋之前的 -->
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>
<!-- 存儲所有error信息 -->
<RollingRandomAccessFile name="errorLog" fileName="${logDir}/${App}-error.log" immediateFlush="false"
filePattern="${logDir}/$${date:yyyy-MM}/${App}-error-%d{MM-dd-yyyy}-%i.log.gz"
append="false">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} [%t] %-5level %logger{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<SizeBasedTriggeringPolicy size="${splitSize}"/>
</Policies>
<Filters>
<!-- 只記錄error級別信息 -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!-- 指定每天的最大壓縮包個數,默認7個,超過了會覆蓋之前的 -->
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncLogger name="springfox" level="OFF"></AsyncLogger>
<!-- root logger 配置,全局配置,默認所有的Logger都繼承此配置 -->
<!-- AsyncRoot - 異步記錄日誌 - 需要LMAX Disruptor的支持 -->
<AsyncRoot includeLocation="true">
<AppenderRef ref="infoLog"/>
<AppenderRef ref="errorLog"/>
<AppenderRef ref="console"/>
</AsyncRoot>
</logger>
</Loggers>
</Configuration>
3.添加log4j2.compomemt.properties文件,文件內容配置如下:
AsyncLogger.RingBufferSize = 10000 AsyncLoggerConfig.RingBufferSize = 10000 log4j2.AsyncQueueFullPolicy = Discard log4j2.DiscardThreshold = DEBUG
二.log4j2的優點
1.異步模式性能優秀
2.插件化架構易擴展
3.Garbage free/Low garbage/自動降級
三.logback與log4j2的對比:
logback的業務線程會搶佔文件句柄進行日誌輸出,而log4j2的業務線程會將日誌輸出到一個無鎖化的環形隊列中,由Log4j2線程異步讀取日誌數據然後輸出到日誌文件中,所以log4j2比logback的性能更加優秀。