springboot+log4j2+阿里雲日誌

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配置屬性詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章