1. springboot配置文件
log4j2可以有多個配置文件根據環境的不同(本地環境、測試環境、線上環境)可以選擇不同的配置,在application中可以使用以下屬性進行配置:
logging.config=classpath:log4j2-dev.xml
2. log4j2文件格式
log4j2配置文件後綴名只能爲".xml",".json"或者".jsn"。
系統選擇配置文件的優先級(從先到後)如下:
-
(1).classpath下的名爲log4j2-test.json 或者log4j2-test.jsn的文件。
-
(2).classpath下的名爲log4j2-test.xml的文件。
-
(3).classpath下名爲log4j2.json 或者log4j2.jsn的文件。
-
(4).classpath下名爲log4j2.xml的文件。
3. log4j2配置詳解
3.1 level屬性
共有8個級別,按照從低到高爲:ALL< TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
程序會打印高於或等於所設置級別的日誌,也就是說設置的日誌等級越高,打印出來的日誌就越少。
-
ALL:最低等級的,用該級別會打開所有日誌記錄。
-
TRACE:追蹤日誌。
-
DEBUG:指出細粒度信息事件日誌。對調試應用程序非常有幫助的。
-
INFO:消息在粗粒度級別上的日誌。
-
WARN:警告日誌。
-
ERROR:錯誤日誌。
-
FATAL:嚴重錯誤日誌。會導致應用程序的退出的錯誤日誌。
-
OFF:最高等級的,用於關閉所有日誌記錄。
3.2 Configuration
Configuration是根節點。它有兩個屬性(status、monitorinterval)和兩個子節點(Appenders、Loggers)。
status屬性:用來指定log4j2本身的日誌打印級別。例如status="WARN"
monitorinterval屬性:在log4j2中更改配置文件是不用重啓的,也就是說log4j2會定時查看自身的配置。 monitorinterval就是用來指定監測間隔時間的,單位是s,最小是5s。例如monitorinterval=“6”
3.2.1 Appenders節點
Appenders是Configuration的子節點,它常見的節點有三種,分別是Console、File、RollingFile。
3.2.2 Console
Console節點是用來定義輸出到控制檯的。
name屬性:指定Console的名字。例如name=“test”
target屬性:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認值:SYSTEM_OUT。
3.2.3 File
File節點是用來定義日誌輸出的目標文件的。
name屬性:指定Console的名字。例如name=“file”
3.2.4 RollingFile
RollingFile節點是用來根據指定規則(時間或者大小)來自動保存當前日誌並創建新日誌。
name屬性:指定Console的名字。例如name=“rollingFile”。
fileName屬性:用來指定日誌的目標文件路徑。例如fileName="/home/logTest.log"。
filePattern屬性:用來指定新建日誌文件的文件路徑。例如filePattern="/home/logTest.log.%d{yyyy-MM-dd}"
Policies
Policies節點是RollingFile的子節點。用來指定滾動日誌的策略,就是什麼時候進行新建日誌。有兩個子節點TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy
TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 ,一般和modulate=true一起使用。如果filePattern是精確到天,那麼,interval=1就代表一天一次;interval=2代表兩天一次;如果filePattern是精確到小時,那麼,interval=1就代表一小時一次;interval=2代表兩小時一次。
例如按天:
<RollingFile name="File" fileName="/home/logTest.log"
filePattern="/home/logTest.log.%d{yyyy-MM-dd}">
<PatternLayout pattern="[%d{dd/HH:mm:ss} %p] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
</RollingFile>
例如按2小時:
<RollingFile name="File" fileName="/home/logTest.log"
filePattern="/home/logTest.log.%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="[%d{dd/HH:mm:ss} %p] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="2"/>
</Policies>
</RollingFile>
SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日誌文件的大小。如果超過size指定的大小就會滾動一次。
例如按大小100M:
<RollingFile name="File" fileName="/home/logTest.log"
filePattern="/home/logTest.log.%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="[%d{dd/HH:mm:ss} %p] %m%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
DefaultRolloverStrategy:max屬性可以用來指定同一個文件夾下最多有幾個日誌文件,超出時就刪除最舊的,創建新的。如果<DefaultRolloverStrategy max="20"/>
、filePattern="/home/logTest.log.%d{yyyy-MM-dd}-%i.log"
,那麼home底下最多20個文件。
<RollingFile name="File" fileName="/home/logTest.log"
filePattern="/home/logTest.log.%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="[%d{dd/HH:mm:ss} %p] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="2"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
3.2.5 Appenders子節點的公共節點
PatternLayout
1.PatternLayout是用來指定日誌格式的。默認爲<PatternLayout pattern="%m%n"/>
2.PatternLayout的參數:
參數 | 說明 | 例子 | |
---|---|---|---|
%c
|
列出logger名字空間的全稱,如果加上{<層數>}表示列出從最內層算起的指定層數的名字空間 |
log4j配置文件參數舉例
|
輸出顯示媒介
|
假設當前logger名字空間是"a.b.c" | |||
%c | a.b.c | ||
%c{2} | b.c | ||
%20c | (若名字空間長度小於20,則左邊用空格填充) | ||
%-20c | (若名字空間長度小於20,則右邊用空格填充) | ||
%.30c | (若名字空間長度超過30,截去多餘字符) | ||
%20.30c | (若名字空間長度小於20,則左邊用空格填充;若名字空間長度超過30,截去多餘字符) | ||
%-20.30c | (若名字空間長度小於20,則右邊用空格填充;若名字空間長度超過30,截去多餘字符) | ||
%C
|
列出調用logger的類的全名(包含包路徑) | 假設當前類是"org.apache.xyz.SomeClass" | |
%C | org.apache.xyz.SomeClass | ||
%C{1} | SomeClass | ||
%d
|
顯示日誌記錄時間,{<日期格式>}使用ISO8601定義的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS} | 2005/10/12 22:23:30,117 |
%d{ABSOLUTE} | 22:23:30,117 | ||
%d{DATE} | 12 Oct 2005 22:23:30,117 | ||
%d{ISO8601} | 2005-10-12 22:23:30,117 | ||
%F
|
顯示調用logger的源文件名 | %F | MyClass.java |
%l
|
輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數 | %l | MyClass.main(MyClass.java:129) |
%L
|
顯示調用logger的代碼行 | %L | 129 |
%m
|
顯示輸出消息 | %m | This is a message for debug. |
%M
|
顯示調用logger的方法名 | %M | main |
%n
|
當前平臺下的換行符 | %n | Windows平臺下表示rn UNIX平臺下表示n |
%p
|
顯示該條日誌的優先級 | %p | INFO |
%r
|
顯示從程序啓動時到記錄該條日誌時已經經過的毫秒數 | %r | 1215 |
%t
|
輸出產生該日誌事件的線程名 | %t | MyClass |
%x
|
按NDC(Nested Diagnostic Context,線程堆棧)順序輸出日誌 | 假設某程序調用順序是MyApp調用com.foo.Bar | |
%c %x - %m%n | MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp. |
||
%X
|
按MDC(Mapped Diagnostic Context,線程映射表)輸出日誌。通常用於多個客戶端連接同一臺服務器,方便服務器區分是那個客戶端訪問留下來的日誌。 | %X{5} | (記錄代號爲5的客戶端的日誌) |
%%
|
顯示一個百分號 | %% | % |
Filters
Filters是一組過濾器,其中一個ThresholdFilter是一個過濾器。
ThresholdFilter是Filters的子節點,有三個屬性level、onMatch、onMismatch。onMatch和onMismatch都有三個值:ACCEPT(接受),DENY(拒絕),NEUTRAL(中立)。
level代表要匹配的日誌級別。
onMatch代表對level對應的日誌級別及以上要進行的操作。如果是ACCEPT(接受)就會輸出日誌;如果是DENY(拒絕)就會不會輸出,如果是NEUTRAL(中立)就會交給下一個ThresholdFilter處理。
例:
<!--匹配ERROR及以上級別-->
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
onMismatch代表對level對應的日誌級以下要進行的操作。如果是ACCEPT(接受)就會輸出日誌;如果是DENY(拒絕)就會不會輸出,如果是NEUTRAL(中立)就會交給下一個ThresholdFilter。
例:
<!--匹配ERROR以下級別-->
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
組合:
<!--匹配INFO級別,其它下級別拒絕-->
<!--不匹配Warn及以上級別,Warn以下級別下一個ThresholdFilter處理-->
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<!--匹配INFO及以上級別,INFO以下級別拒絕-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
3.3 Loggers
Loggers節點可以根據文件來控制日誌。
3.3.1 Root
Root節點用來指定項目的根日誌,如果沒有單獨指定Logger,那麼就會默認使用該Root日誌輸出
level屬性:日誌輸出級別。
AppenderRef:Root的子節點,用來指定該日誌輸出到哪個Appender。
3.3.2 Logger
Logger節點用來單獨指定日誌的形式,比如要爲指定包下的class指定不同的日誌級別等。
level屬性:日誌輸出級別。
name屬性:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
AppenderRef:Logger的子節點,用來指定該日誌輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那麼會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。
4. 阿里雲日誌配置詳解
如果log4j2要配合阿里雲日誌使用,需要導入阿里jar包,然後在Appenders
中添加Loghub
<!--aliyunLog4j-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log-log4j2-appender</artifactId>
<version>0.1.11</version>
</dependency>
<Appenders>
<Loghub name="Loghub"
#指定日誌服務的項目名稱(必需)
project="your project"
#指定日誌服務的日誌存儲,必需
logStore="your logStore"
#指定日誌服務的HTTP端點(必需)
endpoint="your project endpoint"
#指定日誌服務的帳戶信息keyId(必需)
accessKeyId="your accessKey id"
#指定日誌服務的帳戶信息key(必需)
accessKeySecret="your accessKey secret"
#單個producer實例可以容納的日誌大小上限,默認爲100MB
totalSizeInBytes="104857600"
#如果生產者沒有足夠的空閒空間,調用方在發送方法上的最大阻塞時間,默認值爲60秒。
maxBlockMs="60000"
#執行日誌發送任務的線程池大小,默認值是可用的處理器數。
ioThreadCount="8"
#當生產者批次處理中的緩存日誌的大小大於或等於batchsizethreshold oldinbytes時,將發送該批處理,默認爲512KB,最大可設置爲5MB。
batchSizeThresholdInBytes="524288"
#當生產批次中緩存的日誌條目數大於或等於batchCountThreshold時,將發送批次。
batchCountThreshold="4096"
#生產批次從創建到發送有一個駐留時間,默認值爲2秒,最小值爲100毫秒。
lingerMs="2000"
#如果第一次發送失敗,則可以重試生產批次的次數,默認值爲10。
retries=10
#第一次重試的回退時間,默認爲100毫秒。
baseRetryBackoffMs="100"
#重試的最大退避時間,默認爲50秒。
maxRetryBackoffMs="100"
#指定日誌的主題,默認爲""
topic="your topic"
#指定日誌的源,默認爲主機ip
source="your source"
#指定字段time的時間格式,默認爲yyyy-MM-dd'T'HH:MM:ssZ
timeFormat="yyyy-MM-dd'T'HH:mmZ"
#指定字段時間的時區,默認爲UTC
timeZone="UTC"
#是否忽略異常
ignoreExceptions="true">
#日誌格式
<PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/>
</Loghub>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="Loghub"/>
</Root>
</Loggers>
5. springboot+log4j2+阿里雲日誌示例
5.1 springboot
示例中使用xml,並且將部分info日誌及error日誌打印到阿里日誌庫
1.修改pom文件,去除springboot自帶的日誌,以及引入ali日誌的jar
<!--去除springboot自帶的日誌-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--aliyunLog4j-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log-log4j2-appender</artifactId>
<version>0.1.11</version>
</dependency>
2.在啓動文件加上@Log4j2
。springboot 2.0之前可以不加,springboot 2.0之後必須要加
3.構建xml配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%p %m%n"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<Loghub name="LogHub"
project="ali項目名"
logstore="ali日誌庫名"
endpoint="地址"
accessKeyId="ali日誌的accessKeyId"
accessKeySecret="ali日誌的accessKey"
timeZone="時區">
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Loghub>
<Loghub name="LogHubError"
project="ali項目名"
logstore="ali日誌庫名"
endpoint="地址"
accessKeyId="ali日誌的accessKeyId"
accessKeySecret="ali日誌的accessKey"
timeZone="時區">
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Loghub>
<RollingFile name="File" fileName="/home/log/logName.log"
filePattern="/home/log/logName.log.%d{yyyy-MM-dd}">
<PatternLayout pattern="[%d{dd/HH:mm:ss} %p] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="info" level="INFO">
<AppenderRef ref="LogHub"/>
</Logger>
<Logger name="org.springframework" level="INFO"></Logger>
<Logger name="com.test.mapper" level="DEBUG"></Logger>
<Root level="INFO">
<AppenderRef ref="LogHubError"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
4.打印日誌
private static Logger loggerInfo= LogManager.getLogger("info");
private static Logger loggerError= LogManager.getLogger("error");
public static void main(String[] args) {
loggerInfo.info("11111111");
loggerInfo.error("22222222");
loggerError.error("33333333");
}
Loggers中規定name=“info"且日誌級別在INFO以上的會在LogHub進行過濾。而且,所有日誌INFO以上的會進入LogHubError進行過濾。所以,LogHub中會收集到字符串"11111111”、“22222222”;LogHubError中會收集到字符串"33333333"、“22222222”。"22222222"在LogHub、LogHubError都會出現。
/home/log/logName.log文件中會儲存所有的日誌,並且每天都會生成一個日誌文件。
<Logger name="org.springframework" level="INFO"></Logger>
表示將spring框架的日誌只打印INFO級別以上的。
<Logger name="com.test.mapper" level="DEBUG"></Logger>
表示在數據持久化時日誌打印DEBUG級別以上的。
5.2 注意事項
com.aliyun.openservices如果用0.1.10版本,project要改爲projectName,accessKeySecret要該爲accessKey
參考文章:log4j2配置屬性詳解