java的日誌系統-slf4j

日誌系統

爲了觀察系統日誌的結果,這裏首先寫下測試類,TT.java:

package cn.ideacs.learn.test.spring.context;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TT {
    @Test
    public void test1() {
        Logger logger = LoggerFactory.getLogger(TT.class);
        logger.info("lalala");
    }

}

項目利用maven來加入依賴,其它形式的以來加入請自行解決,記i昂各個依賴包加入到類路徑下。

爲了使系統能夠在各種日誌框架之間自由的轉換,我們使用slf4j日誌框架,這是一個日誌的”接口”框架,具體使用那個實現,要看系統的設置,這裏首先需要引入slf4j的依賴包:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

下面介紹各種實現框架的設置和測試結果

  1. slf4j-simple

這是slf4j框架自己實現的一個框架,使用該實現,需要在類路徑中引入slf4j-simple-{version}.jar包。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.8.0-alpha2</version>
</dependency>

測試結果:

[main] INFO cn.ideacs.learn.test.spring.context.TT - lalala
  1. slf4j-jdk1.4

這是jdk自帶的日誌框架,使用該實現,需要在類路徑中引入slf4j-jdk14-{version}包。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.25</version>
</dependency>

測試結果:

十二月 20, 2017 3:55:37 下午 cn.ideacs.learn.test.spring.context.TT test1
信息: lalala
  1. slf4j-jcl

這是java common logging 框架,使用該實現需要引入slf4j-jcl-{version}.jar和commons-logging-{version}.jar依賴包。

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jcl</artifactId>
    <version>1.7.25</version>
</dependency>

測試結果:

十二月 20, 2017 4:15:08 下午 cn.ideacs.learn.test.spring.context.TT info
信息: lalala

筆者理解,這裏的輸出和jdk-logging輸出是一致的,因爲commons-logginslf4j一樣是一個日誌門面(存在osgi問題),這個首先是slf4j門面轉爲commons-logging門面,然後commons-logging門面調用的是jdk-logging的日誌框架,所以和slf4j-jdk14框架的現實結果是一致的。

  1. slf4j-log4j

這個需要說明了,由於log4j從1.x版本到2.x版本經歷的重大更新,使得性能大幅度的提升。如果使用的1.x的版本需要引入的包是slf4j-log4j12-{version}.jarlog4j.jar,1.x的配置和2.x的略有差異,1.x的具體配置這裏不再細說,這裏直接介紹2.x的配置。使用2.x需要引入的包log4j-core-{version}.jarlog4j-api-{version}.jarlog4j-slf4j-impl-{version}.jar,如果是web項目,還需要log4j-web-{version}.jar,但是也可以在依賴的底層包中設置slf4j,然後在web項目中使用,比如,建立工具項目,在工具項目中配置設置日誌的有關開發,在web項目中引入就可,並在web的classpath中設置log4j2.xml等設置即可。

使用log4j框架需要在項目類路徑下配置log4j,使用log4j2,則需要log4j2.xml(其它類型的配置,文件名必須是log4j2,不同的是文件擴展名)。首先配置在控制檯輸出的log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

測試結果是:

17:33:01.198 [main] INFO  cn.ideacs.learn.test.spring.context.TT - lalala

另外設置一個一般系統中常用的記錄日誌的方式的log4j2的配置,主要是使用RollingRandomAccessFile來自由的記錄日誌,具體配置爲log4j2.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="DEBUG" monitorInterval="30">

    <properties>
        <property name="LOG_HOME">/data1/logs/test</property>
        <property name="JPID">1</property>
    </properties>

    <Appenders>
        <RollingRandomAccessFile name="InfoFile"
                                 fileName="${LOG_HOME}/log-info-${sys:JPID}.log"
                                 filePattern="${LOG_HOME}/webapi-info-${sys:JPID}-%d{yyyy-MM-dd-HH}.log">
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%X{tracker-uuid}@%X{tracker-from}][%X{tracker-ext}] %level [%thread][%file:%line] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="300" />
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <Logger name="com.anjuke.trisomic.mybatis" level="info" additivity="false">
            <AppenderRef ref="InfoFile"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="InfoFile" />
            <AppenderRef ref="ErrorFile" />
        </Root>
    </Loggers>
</Configuration>

這裏具體介紹下各個配置的含義

Configuration是配置的根節點,屬性status是配置StatusLogger的屬性,由於應用在加載配置的時候,還未及時的加載其他的日誌配置,在log4j-2.9默認是將信息輸出在控制檯,配置這個屬性,就是爲了獲得這個Logger對象:protected final static Logger logger = StatusLogger.getLogger(),這個屬性配置的就是這個logger的輸出級別。monitorInterval屬性是配置多久系統自動加載一次log的配置,最小粒度是5秒,方便系統修改日誌的配置,而不用重新啓動應用。

properties節點是聲明配置終將要應用的屬性 。

Appenders是聲明日誌的輸出方式,子節點RollingRandomAccessFile爲具體的聲明,還表示自由寫入。其子節點Filters是設置日誌輸出的過濾。PatternLayout是設置日誌的輸出格式。Policies是因爲日誌記錄的可能導致日誌文件非常龐大,所以設置一定的策略將達到一定條件的日誌文件進行拆分。TimeBasedTriggeringPolicy是設置根據時間來拆分文件,interval設置的是間隔時間,其單位是日誌文件名的時間最後以爲,這裏的時間最後以爲是HH,小時,所以就是沒個小時生成一個新的文件;SizeBasedTriggeringPolicy是根據日誌文件的大小來決定文件的拆分,size=”500kb”設置的是每個日誌文件最大500kb的時候就會拆分。DefaultRolloverStrategy設置的是相同文件名(除了數字部分)的數量最大多少個文件,超過了則會覆蓋最早出現的文件。

Loggers是設置具體的Logger使用的日誌輸出配置,Logger節點是設置具體的日誌,name=”a.b”的日誌是name=”a.b.c”的日誌的父日誌,additivity設置的是是否在父日誌中輸出該日誌,如果爲false則只在該日誌輸出結果。Root是設置根日誌。

上面的配置會在目錄/data1/logs/test/下生成日誌文件,文件內容爲:

2017-12-20 18:02:59.502 [@][] INFO [main][TT.java:15] - lalala
  1. logback-classic

這個日誌框架是實現slf4j的本地化,可以實現更高的性能,筆者沒有研究過,以後補充。

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