log4j2使用及log4j2.xml分析
我們使用slf4j + log4j2作為專案的日誌組合
pom
<!-- slf4j核心包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
<scope>compile</scope>
</dependency>
<!-- log4j2 非同步日誌依賴-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
demo
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4j {
@Test
public void test() {
Logger logger = LoggerFactory.getLogger("slf4j");
logger.error("error");
logger.info("info");
logger.debug("debug");
logger.warn("warn");
}
}
控制檯輸出:
因為log4j2預設輸出級別是error,這是我們沒有配置log4j2.xml的輸出,
接下來我們新增一個log4j2的配置檔案
log4.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
status="warn" 日誌框架本身的輸出日誌級別
monitorInterval="5" 自動載入配置檔案的間隔時間,不低於5秒
-->
<configuration status="OFF" monitorInterval="5">
<!--
集中配置屬性管理,使用時通過${}
類似於pom檔案中的定義
-->
<properties>
<property name="LOG_HOME">/logs</property>
</properties>
<!-- 日誌處理 -->
<appenders>
<!-- 控制檯輸出 -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<!-- 日誌輸出格式 -->
<PatternLayout pattern="%d [%X{applicationName}] [%X{traceId}] [%X{spanName}] [%t] [%-5level] [%c{36}] %M %L - %msg%xEx%n"/>
</Console>
<!-- 日誌檔案輸出 -->
<File name="file" fileName="${LOG_HOME}/myFile.log">
<!-- 日誌輸出格式 -->
<PatternLayout pattern="%d [%X{applicationName}] [%X{traceId}] [%X{spanName}] [%t] [%-5level] [%c{36}] %M %L - %msg%xEx%n"/>
</File>
<!-- 非同步appender -->
<Async name="Async">
<AppenderRef ref="ROLLING"/>
</Async>
<!-- 隨機讀寫流日誌檔案輸出 效率提升 -->
<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAccFile.log">
<!-- 日誌輸出格式 -->
<PatternLayout pattern="%d [%X{applicationName}] [%X{traceId}] [%X{spanName}] [%t] [%-5level] [%c{36}] %M %L - %msg%xEx%n"/>
</RandomAccessFile>
<!-- 按照一定規則拆分日誌檔案的 appender 、
filePattern:拆分後的檔案命名
-->
<RollingFile name="ROLLING" fileName="logs/stdout.log" filePattern="logs/stdout.%d{yyyy-MM-dd}-%i.log.gz">
<!-- 日誌級別過濾器 -->
<ThresholdFilter level="debug" onMatch="ACCEPT"></ThresholdFilter>
<!-- 日誌輸出格式 -->
<PatternLayout pattern="%d [%X{applicationName}] [%X{traceId}] [%X{spanName}] [%t] [%-5level] [%c{36}] %M %L - %msg%xEx%n"/>
<!-- 具體拆分策略 -->
<Policies>
<!-- 在系統啟動時就生成一個日誌檔案 -->
<OnStartupTriggeringPolicy />
<!-- 按照大小拆分 -->
<SizeBasedTriggeringPolicy size="10 MB"/>
<!-- 按照時間節點進行拆分 規則根據前邊的filePattern定義-->
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
<!-- 在同一個目錄下 檔案的個數 防止日誌檔案過多佔滿磁碟 超過會進行覆蓋-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
<!-- logger定義 -->
<loggers>
<!-- 使用rootLogger進行配置 -->
<Root level="info">
<!-- 指定使用哪個appender,appenders標籤中定義的 -->
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="ROLLING"/>
<!-- 使用非同步的appender 生產中不推薦使用-->
<AppenderRef ref="Async"/>
</Root>
<!-- 使用非同步logger 非同步輸出日誌,注意asyncLogger 和 asyncAppender是兩種不同的非同步實現方式
name:可以是包路徑比如:org.apache,使用方式:Logger logger=LoggerFactory.getLogger(getClass());那麼所有org.apache包下的日誌都寫在這個asynclogger
也可以是自定義名字比如:myLogger,使用方式:Logger logger=LoggerFactory.getLogger("myLogger");那麼該日誌寫在這個asynclogger
includeLocation:關閉日誌記錄的行號資訊
additivity="false":不再繼承rootLogger物件
-->
<AsyncLogger name="myAsyncLogger" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="file"/>
</AsyncLogger>
</loggers>
</configuration>
非同步輸出日誌
log4j2提供了兩種非同步實現方式,一個是通過AsyncAppender,對應標籤appenders中的,另一個是AsyncLogger,對應標籤loggers;我們選擇AsyncLogger,因為AsyncAppender效能提升不大
使用時需要新增maven依賴
<!-- log4j2 非同步日誌依賴-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
AsyncLogger配置又分為兩種:
1、全域性配置
無需修改log4j2.xml,所有日誌輸出全部非同步
新增log4j2.component.properties檔案
內容:
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
2、區域性配置
需要修改log4j2.xml
loggers標籤中增加
<!-- 使用非同步logger 非同步輸出日誌,注意asyncLogger 和 asyncAppender是兩種不同的非同步實現方式
name:可以是包路徑比如:org.apache,使用方式:Logger logger=LoggerFactory.getLogger(getClass());那麼所有org.apache包下的日誌都寫在這個asynclogger
也可以是自定義名字比如:myLogger,使用方式:Logger logger=LoggerFactory.getLogger("myLogger");那麼該日誌寫在這個asynclogger
includeLocation:關閉日誌記錄的行號資訊
additivity="false":不再繼承rootLogger物件
-->
<AsyncLogger name="myAsyncLogger" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="file"/>
</AsyncLogger>
相關文章
- SpringBoot—整合log4j2入門和log4j2.xml配置詳解Spring BootXML
- Log4j2常見使用示例及Syslog/Syslog-ng
- SDWebImage使用及原始碼分析Web原始碼
- Apache Log4j2,RASP 防禦優勢及原理Apache
- In和exists使用及效能分析(一):in的使用
- 使用Log4j2輸出日誌演示
- MySQL下Limit使用及效能分析MySqlMIT
- In和exists使用及效能分析(二):exists的使用
- ThreadPoolExecutor的使用及原始碼分析thread原始碼
- perf及火焰圖的使用,效能分析
- drf 檢視使用及原始碼分析原始碼
- #BottomNavigationView使用及原始碼分析NavigationView原始碼
- Log4j2—漏洞分析(CVE-2021-44228)
- In和exists使用及效能分析(三):in和exists的效能分析
- 在java下使用log4j2記錄日誌Java
- Laravel 中介軟體使用及原始碼分析Laravel原始碼
- 使用Android Profile做效能分析及優化Android優化
- DRF檢視的使用及原始碼流程分析原始碼
- 微服務下,使用ELK做日誌收集及分析微服務
- Java JDK 動態代理使用及實現原理分析JavaJDK
- 使用xhprof進行線上PHP效能追蹤及分析PHP
- Spring Boot 2 中如何使用 Log4j2 記錄日誌Spring Boot
- log4j2生效
- Spring事務原始碼分析專題(一)JdbcTemplate使用及原始碼分析Spring原始碼JDBC
- golang 中 channel 的詳細使用、使用注意事項及死鎖分析Golang
- Buffer的建立及使用原始碼分析——ByteBuffer為例原始碼
- Redis 5種資料結構 及使用場景分析Redis資料結構
- SpringAOP使用及原始碼分析(SpringBoot下)原始碼Spring Boot
- Java JDK 動態代理(AOP)使用及實現原理分析JavaJDK
- Linux系統ifconfig使用及結果分析Linux
- 使用 Apache APISIX serverless 能力快速攔截 Apache Log4j2 的高危漏洞ApacheAPIServer
- 此起彼伏;及燈分析
- log4j2 自動刪除過期日誌檔案配置及實現原理解析
- SPI擴充套件點在業務中的使用及原理分析套件
- Java-JDK動態代理(AOP)使用及實現原理分析JavaJDK
- 07 併發工具類CountDownLatch、CyclicBarrier、Semaphore使用及原始碼分析CountDownLatch原始碼
- js裡關於Array.prototype.sort分析及日常使用技巧JS
- C++ 11 中正規表示式使用示例及原始碼分析C++原始碼