SpringBoot日志框架之Log4j2快速入門與參數(shù)詳解
Quick Start
在SpringBoot中使用log4j2日志框架,只需三步:
- 引入依賴
- 配置log文件
- 獲取Logger實例并輸出日志
引入依賴
dependencies {
implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
implementation('org.springframework.boot:spring-boot-starter') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}為了避免日志框架之間的沖突,建議在使用Log4j2時將其他的日志框架排除掉,例如在build.gradle文件中排除Spring Boot默認的Logback日志框架
配置log文件
創(chuàng)建Log4j2的配置文件log4j2.xml,可以放在src/main/resources目錄下或指定的目錄下。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>上面的配置文件定義了一個名為Console的Appender,用于將日志輸出到控制臺。它使用了PatternLayout來定義日志輸出格式,包含了日期、線程、日志級別、Logger名稱和消息等信息。在Loggers中,我們將根Logger的日志級別設置為info,并將Console Appender添加到根Lodagger中。
獲取Logger實例并輸出日志
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyService {
private static final Logger logger = LogManager.getLogger(MyService.class);
public void doSomething() {
logger.debug("Debug message");
logger.info("Info message");
logger.warn("Warning message");
logger.error("Error message");
}
}使用LogManager獲取Logger實例,然后使用Logger的debug、info、warn和error方法來記錄不同級別的日志。

這是日志輸出結(jié)果,機智的朋友可能已經(jīng)發(fā)現(xiàn)了,這段輸出里沒有debug級別的日志,這是因為在默認情況下,Logback 只會輸出 INFO 級別及以上的日志信息。
我們把日志級別從info改成debug就可以輸出debug日志了
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
@Slf4j注解
@Slf4j 是 Lombok 提供的一個注解,用于在編譯時自動生成日志變量。
dependencies {
implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
implementation('org.springframework.boot:spring-boot-starter') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}使用 @Slf4j 注解需要引入 lombok 和 SLF4J 的依賴。
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyClass {
public void myMethod() {
log.info("這是一條日志");
}
}@Slf4j 注解會自動生成一個名為 log 的日志變量,我們可以直接使用 log 對象來記錄日志。
log4j2.xml 詳解
log4j2.xml 是 log4j 2.x 版本的配置文件格式,用于配置日志記錄器的行為。它可以定義多個日志記錄器、日志輸出器和日志格式。
標簽簡介
以下是一些 log4j2.xml 中的重要標簽:
<Configuration>:定義整個配置文件的根元素,它有一個 status 屬性,用于控制日志框架的日志輸出級別。status 屬性的值可以是 ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL 或 OFF 中的任何一個,默認值為 OFF。<Appenders>:定義日志輸出器的集合,可以包含多個 Appender。每個 Appender 可以有自己的日志輸出方式和格式化方式,以滿足不同的需求。<Logger>:定義一個 Logger 對象,它可以有自己的日志級別、Appenders 和過濾器等屬性。Logger 元素還可以通過子元素<AppenderRef>來引用一個或多個 Appenders,將它們附加到該 Logger 上。<Root>:定義 Root Logger 對象,它是所有 Logger 的父 Logger。它的級別通常設置為最低級別,以便將所有日志消息傳遞到其他 Logger 或 Appender。Root 元素也可以通過子元素<AppenderRef>來引用一個或多個 Appenders,將它們附加到 Root Logger 上。<Filter>:定義一個或多個過濾器,用于控制哪些日志消息被記錄和輸出。過濾器可以根據(jù)日志級別、消息內(nèi)容、時間戳等條件進行過濾。<PatternLayout>:定義日志格式化器,用于將日志消息格式化成一行一行的文本。PatternLayout 可以使用一系列占位符,表示日志消息的不同部分,例如時間戳、線程名、日志級別、類名、方法名、消息內(nèi)容等。<RollingFile>:定義一個 RollingFile Appender,用于將日志輸出到文件,并實現(xiàn)滾動文件的功能。RollingFile Appender 可以按照時間、文件大小等條件進行滾動,并設置最多保留多少個日志文件。<Console>:定義一個 Console Appender,用于將日志輸出到控制臺。<Elasticsearch>:定義一個 Elasticsearch Appender,用于將日志輸出到 Elasticsearch 中。
輸出到控制臺
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>該文件定義了一個名為 Console 的 Appender,用于將日志輸出到控制臺。
PatternLayout格式化字符串含義如下:
%d{yyyy-MM-dd HH:mm:ss.SSS}:輸出日志時間的格式,其中yyyy表示四位年份,MM表示兩位月份,dd表示兩位日期,HH表示24小時制的小時數(shù),mm表示分鐘數(shù),ss表示秒數(shù),SSS表示毫秒數(shù)。[%t]:輸出線程名稱。%-5level:輸出日志級別,其中-表示左對齊,5表示占位符寬度,level表示日志級別。%logger{36}:輸出logger名稱,其中36表示logger名稱的最大寬度。%msg%n:輸出日志消息和換行符。
該文件還定義了一個 Root logger,將日志級別設置為 info,表示只輸出 INFO 級別及以上的日志信息,并將它的 AppenderRef 設置為 Console。
輸出到文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
<Appenders>
<RollingFile name="RollingFile" fileName="/path/to/logs/myapp.log"
filePattern="/path/to/logs/myapp-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>這個配置文件中定義了一個名為 RollingFile 的 Appender,用于將日志輸出到文件。
RollingFile Appender 使用了 TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy,表示按時間和文件大小來滾動文件,以避免日志文件過大。DefaultRolloverStrategy 表示最多保留 10 個日志文件。
輸出到多個文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
<Appenders>
<Routing name="Routing">
<Routes pattern="$${ctx:logFileName}">
<Route>
<File name="file" fileName="/path/to/logs/${ctx:logFileName}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Routing"/>
</Root>
</Loggers>
</Configuration>這個配置文件中定義了一個名為 Routing 的 Appender,用于按照日志文件名將日志輸出到不同的文件中。Routing Appender 使用了 Routes 和 Route 元素,將日志按照日志文件名的不同路由到不同的 File Appender 中,實現(xiàn)了將日志輸出到多個文件的功能。
輸出Elasticsearch
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="org.apache.logging.log4j.core,com.fasterxml.jackson.databind.json">
<Appenders>
<Elasticsearch name="elasticsearch" type="http" index="log4j2" indexDateFormat="yyyy-MM-dd" ignoreExceptions="false">
<ServerHost>localhost</ServerHost>
<ServerPort>9200</ServerPort>
<IndexType>doc</IndexType>
<SourceHost>${env:HOSTNAME}</SourceHost>
<JacksonJsonLayout compact="true" />
</Elasticsearch>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="elasticsearch" />
</Root>
</Loggers>
</Configuration>上述配置文件中,<Elasticsearch> 元素定義了 Elasticsearch Appender 的配置,其中包含了以下屬性:
name:指定 Appender 的名稱,可自定義。type:指定 Elasticsearch 連接類型,這里使用的是 HTTP連接方式。index:指定 Elasticsearch 中的索引名稱。indexDateFormat:指定日志索引的日期格式。ignoreExceptions:指定是否忽略異常,如果設置為false,則在出現(xiàn)異常時會中斷應用程序。ServerHost:指定 Elasticsearch 服務器的主機名或 IP 地址。ServerPort:指定 Elasticsearch 服務器的端口號。IndexType:指定 Elasticsearch 索引類型。SourceHost:指定日志來源的主機名或 IP 地址。JacksonJsonLayout:指定日志輸出的格式,這里使用了 JacksonJsonLayout。
配置多個Appenders
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="/path/to/logs/myapp.log"
filePattern="/path/to/logs/myapp-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>在這個例子中,我們定義了一個名為 Console 的 Appender 和一個名為 RollingFile 的 Appender。Console Appender 用于將日志輸出到控制臺,RollingFile Appender 用于將日志輸出到文件。在 Loggers 元素中,我們將 Root logger 的 AppenderRef 分別設置為 Console 和 RollingFile,表示將日志同時輸出到控制臺和文件中。
每個 Appender 必須有一個唯一的 name 屬性,用于在其他地方引用該 Appender。在 Loggers 元素中,可以通過 AppenderRef 元素來引用一個或多個 Appenders,并將它們附加到特定的 Logger 上。也可以通過 Logger 元素來定義一個新的 Logger,并將其與一個或多個 Appenders 關聯(lián)起來。
輸出到kafka
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="org.apache.logging.log4j.core,com.fasterxml.jackson.databind.json">
<Appenders>
<Kafka name="Kafka" topic="myTopic" syncSend="false">
<Property name="bootstrap.servers">localhost:9092</Property>
<Property name="acks">1</Property>
<Property name="batch.size">32768</Property>
<Property name="compression.type">snappy</Property>
<Property name="retries">20</Property>
<Property name="reconnect.backoff.ms">20000</Property>
<Property name="retry.backoff.ms">20000</Property>
<PatternLayout pattern="${LOG_PATTERN}" charset="utf-8"/>
</Kafka>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Kafka" />
</Root>
</Loggers>
</Configuration>Kafka
topic屬性:指定 Kafka 主題的名稱,這里設置為myTopic。bootstrap.servers屬性:指定 Kafka 服務器的地址和端口號,這里設置為localhost:9092。acks屬性:指定 Kafka 生產(chǎn)者的確認級別。這里設置為1,表示只需要 Kafka 生產(chǎn)者收到消息就返回確認消息。batch.size屬性:指定 Kafka 生產(chǎn)者批量發(fā)送消息的大小。這里設置為32768。compression.type屬性:指定消息的壓縮類型,這里設置為snappy。retries屬性:指定 Kafka 生產(chǎn)者在發(fā)生錯誤時的重試次數(shù)。這里設置為20。reconnect.backoff.ms屬性:指定 Kafka 生產(chǎn)者在重新連接到 Kafka 服務器之前的等待時間。這里設置為20000毫秒。retry.backoff.ms屬性:指定 Kafka 生產(chǎn)者在發(fā)生錯誤時的重試等待時間。這里設置為20000毫秒。
配置異步日志記錄器
在 log4j2 中,可以使用異步日志記錄器來提高性能和吞吐量。
異步日志記錄器可以將日志事件放入一個隊列中,然后由另外的線程或線程池來處理隊列中的日志事件,從而降低了日志記錄對應用程序的影響。
下面是在 log4j2.xml 中配置異步日志記錄器的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<Async name="AsyncConsole" bufferSize="16384" queueSize="500" ringBufferSize="1024" blocking="false">
<AppenderRef ref="Console"/>
</Async>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="AsyncConsole"/>
</Root>
</Loggers>
</Configuration><Async> 元素是 Log4j2 中用于實現(xiàn)異步日志輸出的 Appender。以下是 <Async> 元素中各個參數(shù)的解釋:
name:指定異步 Appender 的名稱,可自定義。bufferSize:指定異步隊列的緩沖區(qū)大小,即可以同時緩存的日志事件的數(shù)量。當隊列已滿時,新的日志事件會被直接丟棄。queueSize:指定異步隊列的容量,即可以緩存的日志事件的最大數(shù)量。當超過此數(shù)量時,新的日志事件會被直接丟棄。ringBufferSize:指定異步隊列的環(huán)形緩沖區(qū)大小,這是一個循環(huán)隊列,大小必須是 2 的冪次方。如果未指定bufferSize,則使用ringBufferSize作為緩沖區(qū)大小。blocking:指定是否使用阻塞模式。如果設置為true,則當隊列已滿時,新的日志事件將會被阻塞,直到隊列中有空閑位置。如果設置為false,則當隊列已滿時,新的日志事件會被直接丟棄。AppenderRef:指定異步 Appender 的輸出目的地。
以上就是SpringBoot日志框架之Log4j2快速入門與參數(shù)詳解的詳細內(nèi)容,更多關于SpringBoot Log4j2入門的資料請關注腳本之家其它相關文章!
相關文章
java實現(xiàn)圖片上加文字水印(SpringMVC + Jsp)
這篇文章主要為大家詳細介紹了java實現(xiàn)在圖片上加文字水印的方法,水印可以是圖片或者文字,操作方便,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
關于Object中equals方法和hashCode方法判斷的分析
今天小編就為大家分享一篇關于關于Object中equals方法和hashCode方法判斷的分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
spring boot國際化之MessageSource的使用方法
這篇文章主要給大家介紹了spring boot國際化之MessageSource使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

