log4j2 入门
log4j2的使用
Apache Log4j 2是對Log4j的升級版,參考了logback的一些優秀的設計,并且修復了一些問題,因此帶來了一些重大的提升,主要有:
異常處理,在logback中,Appender中的異常不會被應用感知到,但是在log4j2中,提供了一些異常處理機制。
性能提升, log4j2相較于log4j 和logback都具有很明顯的性能提升,后面會有官方測試的數
自動重載配置,參考了logback的設計,當然會提供自動刷新參數配置,最實用的就是我們在生產上可以動態的修改日志的級別而不需要重啟應用。
無垃圾機制,log4j2在大部分情況下,都可以使用其設計的一套無垃圾機制,避免頻繁的日志收集導致的jvm gc。
官網: https://logging.apache.org/log4j/2.x/
Log4j2入門
目前市面上最主流的日志門面就是SLF4J,雖然Log4j2也是日志門面,因為它的日志實現功能非常強大,性能優越。所以大家一般還是將Log4j2看作是日志的實現,Slf4j + Log4j2應該是未來的大勢所趨。
1. 添加依賴
<!-- Log4j2 門面API--> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version> </dependency> <!-- Log4j2 日志實現 --> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version> </dependency>2. JAVA代碼
package com.leon;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test;public class Log4j2Test {// 定義日志記錄器對象public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class);// 快速入門@Testpublic void testQuick()throws Exception{// 日志消息輸出LOGGER.fatal("fatal");LOGGER.error("error");LOGGER.warn("warn");LOGGER.info("inf");LOGGER.debug("debug");LOGGER.trace("trace");} }Log4j2配置
log4j2默認加載classpath下的 log4j2.xml 文件中的配置。
<?xml version="1.0" encoding="UTF-8"?> <!--status="warn" 日志框架本身的輸出日志級別monitorInterval="5" 自動加載配置文件的間隔時間,不低于 5 秒 --> <Configuration status="debug" monitorInterval="5"><!--集中配置屬性進行管理使用時通過:${name}--><properties><property name="LOG_HOME">/logs</property></properties><!--日志處理--><Appenders><!--控制臺輸出 appender--><Console name="Console" target="SYSTEM_ERR"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /></Console><!--日志文件輸出 appender--><File name="file" fileName="${LOG_HOME}/myfile.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></File><!--<Async name="Async">--><!--<AppenderRef ref="file"/>--><!--</Async>--><!--使用隨機讀寫劉的日志文件輸出 appender,性能提高--><RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></RandomAccessFile><!--按照一定規則拆分的日志文件的 appender--><RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"filePattern="/logs/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log"><!--日志級別過濾器--><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /><!--日志消息格式--><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" /><Policies><!--在系統啟動時,出發拆分規則,生產一個新的日志文件--><OnStartupTriggeringPolicy /><!--按照文件大小拆分,10MB --><SizeBasedTriggeringPolicy size="10 MB" /><!--按照時間節點拆分,規則根據filePattern定義的--><TimeBasedTriggeringPolicy /></Policies><!--在同一個目錄下,文件的個數限定為 30 個,超過進行覆蓋--><DefaultRolloverStrategy max="30" /></RollingFile></Appenders><!--logger 定義--><Loggers><!--自定義異步 logger 對象includeLocation="false" 關閉日志記錄的行號信息additivity="false" 不在繼承 rootlogger 對象--><AsyncLogger name="com.leon" level="trace" includeLocation="false" additivity="false"><AppenderRef ref="Console"/></AsyncLogger><!--使用 rootLogger 配置 日志級別 level="trace"--><Root level="trace"><!--指定日志使用的處理器--><AppenderRef ref="Console" /><!--使用異步 appender--><AppenderRef ref="Async" /></Root></Loggers> </Configuration>使用slf4j作為日志的門面,使用log4j2作為日志的實現
<!-- Log4j2 門面API--> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version> </dependency> <!-- Log4j2 日志實現 --> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version> </dependency> <!--使用slf4j作為日志的門面,使用log4j2來記錄日志 --> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version> </dependency> <!--為slf4j綁定日志實現 log4j2的適配器 --> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.10.0</version> </dependency> package com.leon;import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Slf4jTest {public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);// 快速入門@Testpublic void test01()throws Exception{// 日志輸出LOGGER.error("error");LOGGER.warn("wring");LOGGER.info("info");LOGGER.debug("debug");LOGGER.trace("trace");} }?
總結
- 上一篇: logback 的 access 模块
- 下一篇: log4j2 配置文件