本文章轉自:https://blog.csdn.net/vbirdbest/article/details/71751835
:https://www.cnblogs.com/new-life/p/9246143.html
再次感謝博主分享
1、刪除之前log4j的jar包
2、引入log4j2的jar包
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<!--用於與slf4j保持橋接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- slf4j核心包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
3、配置文件的位置:log4j2默認會在classpath目錄下尋找log4j2.xml、log4j.json;一般放置在src/main/resources根目錄下即可;
4、log4j2.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
<properties>
<property name="APP_NAME" value="serviceA"/>
<property name="log_path" value="/home/logs/${APP_NAME}"/>
<property name="MAXHISTORY" value="365"/>
<property name="PATTERN"
value="[${APP_NAME}] [%-12(%d{yyyy-MM-dd HH:mm:ss.SSS})] [%-5level] [%thread] [%c.%M] [%L] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] ==>> %m%n"/>
</properties>
<!--先定義所有的appender-->
<appenders>
<!--這個輸出控制檯的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--輸出日誌的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
<File name="log" fileName="${log_path}/${APP_NAME}.log" append="false" filePermissions="rw-r--rw-">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的文件夾下面並進行壓縮,作爲存檔-->
<RollingFile name="RollingFileInfo" fileName="${log_path}/${APP_NAME}-info.log"
filePattern="${log_path}/$${date:yyyy-MM}/info-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
<!--控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${log_path}/${APP_NAME}-warn.log"
filePattern="${log_path}/$${date:yyyy-MM}/warn-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件,這裏設置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${log_path}/${APP_NAME}-error.log"
filePattern="${log_path}/$${date:yyyy-MM}/error-${APP_NAME}-%d{yyyy-MM-dd}-%i.log" filePermissions="rw-r--rw-">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然後定義logger,只有定義了logger並引入的appender,appender纔會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
5、配置文件詳解:
Configuration:爲根節點,有status和monitorInterval等多個屬性
status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用於控制log4j2日誌框架本身的日誌級別,如果將stratus設置爲較低的級別就會看到很多關於log4j2本身的日誌,如加載log4j2配置文件的路徑等信息
monitorInterval,含義是每隔多少秒重新讀取配置文件,可以不重啓應用的情況下修改配置
Appenders:輸出源,用於定義日誌輸出的地方
log4j2支持的輸出源有很多,有控制檯Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等
Console:控制檯輸出源是將日誌打印到控制檯上,開發的時候一般都會配置,以便調試
File:文件輸出源,用於將日誌寫入到指定的文件,需要配置輸入到哪個位置(例如:D:/logs/mylog.log)
RollingRandomAccessFile: 該輸出源也是寫入到文件,不同的是比File更加強大,可以指定當文件達到一定大小(如20MB)時,另起一個文件繼續寫入日誌,另起一個文件就涉及到新文件的名字命名規則,因此需要配置文件命名規則
這種方式更加實用,因爲你不可能一直往一個文件中寫,如果一直寫,文件過大,打開就會卡死,也不便於查找日誌。
fileName 指定當前日誌文件的位置和文件名稱
filePattern 指定當發生Rolling時,文件的轉移和重命名規則
SizeBasedTriggeringPolicy 指定當文件體積大於size指定的值時,觸發Rolling
DefaultRolloverStrategy 指定最多保存的文件個數
TimeBasedTriggeringPolicy 這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的時間粒度是mm,即分鐘
TimeBasedTriggeringPolicy指定的size是1,結合起來就是每1分鐘生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度爲小時,則每一個小時生成一個文件
NoSql:MongoDb, 輸出到MongDb數據庫中
Flume:輸出到Apache Flume(Flume是Cloudera提供的一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。)
Async:異步,需要通過AppenderRef來指定要對哪種輸出源進行異步(一般用於配置RollingRandomAccessFile)
PatternLayout:控制檯或文件輸出源(Console、File、RollingRandomAccessFile)都必須包含一個PatternLayout節點,用於指定輸出文件的格式(如 日誌輸出的時間 文件 方法 行數 等格式),例如 pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
%d{HH:mm:ss.SSS} 表示輸出到毫秒的時間
%t 輸出當前線程名稱
%-5level 輸出日誌級別,-5表示左對齊並且固定輸出5個字符,如果不足在右邊補0
%logger 輸出logger名稱,因爲Root Logger沒有名稱,所以沒有輸出
%msg 日誌文本
%n 換行
其他常用的佔位符有:
%F 輸出所在的類文件名,如Log4j2Test.java
%L 輸出行號
%M 輸出所在方法名
%l 輸出語句所在的行數, 包括類名、方法名、文件名、行數
Loggers:日誌器
日誌器分根日誌器Root和自定義日誌器,當根據日誌名字獲取不到指定的日誌器時就使用Root作爲默認的日誌器,自定義時需要指定每個Logger的名稱name(對於命名可以以包名作爲日誌的名字,不同的包配置不同的級別等),日誌級別level,相加性additivity(是否繼承下面配置的日誌器), 對於一般的日誌器(如Console、File、RollingRandomAccessFile)一般需要配置一個或多個輸出源AppenderRef;
每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level默認爲ERROR
additivity指定是否同時輸出log到父類的appender,缺省爲true。
<Logger name="rollingRandomAccessFileLogger" level="trace" additivity="true">
<AppenderRef ref="RollingRandomAccessFile" />
</Logger>
properties: 屬性
使用來定義常量,以便在其他配置的時候引用,該配置是可選的,例如定義日誌的存放位置
D:/logs