Java日志體系

對于任何一個編程語言或者框架來說,在編寫代碼時,日志都是必不可少的內(nèi)容。日志不僅可以幫助開發(fā)者了解系統(tǒng)中出現(xiàn)的問題,也能夠幫助開發(fā)者了解框架、程序是如何運行的。

比如,在Spring框架中,基本上大家都會用log日志來跟蹤filter的執(zhí)行順序、spring的啟動順序等等。

但是日志并不代表是一種簡單的文本輸出,在很多場景下,程序?qū)θ罩镜妮敵瞿繕?、格式、位置、色彩、速度都有要求。因此,市面上有很多出名的框架,例?code>log4j、log4j2logback、jdk log等等。雖然他們當(dāng)中最出名的幾個,都是同一個人寫的。。。

當(dāng)種類變多功能變強的時候,選擇就成為了一個問題。如何選擇一個好用的、好記的日志框架,以及如何快速的適配各種系統(tǒng)需要開發(fā)人員去考慮。

此篇將會記錄Java的日志體系,一些場景下的選擇和常用配置。


什么是日志體系

那么什么是日志體系呢?我們都知道面向接口編程,由大佬們定義接口規(guī)范,小的們?nèi)崿F(xiàn)。這樣程序跑起來的時候,可以不在意究竟是哪一個實現(xiàn)承擔(dān)的任務(wù)。舉個例子。

就像你撥打別人的手機,你只需要撥出號碼,不需要在意對方是電信、移動、聯(lián)通或者是小米之類的通訊商。這就是他們都符合可撥打的規(guī)范帶來的好處。

日志系統(tǒng)也是這樣,不需要在意你用了什么日志框架,無論是log4jlogback或者是jdk原生的java.util.logger,都能夠被log日志的規(guī)范所兼容。

那么,你想要打印日志的時候,你只需要調(diào)用log.info("hello")就可以打印"hello"。**而且,當(dāng)你需要從一個框架遷移到另外一個日志框架的時候,只需要把依賴的日志框架jar包換進來,就立即生效。

而這個規(guī)范、規(guī)范的實現(xiàn)加上日志框架,就成為了日志體系。

在日常,最常見的和最著名的兩種日志體系分別是基于JCL的日志體系和基于Slf4j的日志體系。


基于jcl日志體系

jcl日志體系的接口規(guī)范由commons-logging提供,這是apache commons系列的工具包之一。Apache commons系列的工具包都非常有用,比如流操作、文件復(fù)制、加密解密之類的常用操作,都可以直接找到完善的解決方案。。。具體的操作晚上有很多的介紹,如果你想要知道他一共有多少種,可以直接去Maven倉庫中搜索一下org.apache.commons看看。

commons-logging已經(jīng)停止更新,最后的狀態(tài)如下所示:

jcl architecture

具體的使用。。。因為我已經(jīng)不用了,所以可以參考其他的使用教程:

需要注意的是jcl是存在一定缺陷的,這也是為什么現(xiàn)在大多數(shù)都使用slf4j作為接口規(guī)范。


基于slf4j日志體系

slf4j的歷程也是非常的傳奇,有興趣的可以去搜索看看。
寫了log4j、log4j2、slf4j、logback的傳奇日志作者。。。Ceki

slf4j的全稱為Simple Logging Facade For Java,從下圖可見,slf4j的能耐比jcl大得多,基本上覆蓋了所有出名的(自己寫的...)日志框架。

slf4j architecture.png

slf4j的使用和jcl的使用沒有太大的差異,如下所示:

    //聲明日志對象,Logger的全限定名為
 org.slf4j.Logger 而不是 java.util.Logger
    static  Logger log = LoggerFactory.getLogger(Log02Application.class);
    //簡單的測試方法
    public static void main(String[] args) {
        log.info("hello log");
    }

具體的案例我們通過整合來介紹:

整合springboot

在springboot中,默認使用了logback作為日志框架。默認的輸出如下所示:

2017-11-29 12:58:17.757  INFO 47280 --- [  restartedMain] cn.hhchat.log02.Log02Application         : hello log

但是當(dāng)然你可以自己配置,配置文件放在resources文件目錄下即可,springboot會自動按順序搜尋下列文件。

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
  • Log4j:log4j-spring.properties, log4j-spring.xml, -
    log4j.properties, log4j.xml
  • Log4j2:log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging):logging.properties

使用log4j2

由于springboot默認使用了logback,因此當(dāng)你試圖使用log4j2的時候,你需要先剔除logback。

<!--從spring-boot-starter中剔除logging,該依賴如果沒有的話,可以直接把整個依賴粘上,如果依賴已經(jīng)存在,只需要添加<exclustions>中間的內(nèi)容即可。-->
<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>

整合spring

log4j2配置

日志的配置一直是一個大麻煩,因為每次都要導(dǎo)出翻博客來找,雖然之前看過官方的文檔,但是現(xiàn)在也記不太清了,所以整理一下思路,記錄一個普遍可用的方式供以后復(fù)制使用。

下面是配置的基本步驟:

log4j2配置

首先,你需要先配置一個Logger,logger定義了該logger配置使用的包和日志級別、輸出到什么位置等等內(nèi)容,之后配置Appender,appender表示的是你需要將日志輸出到什么文件以及輸出的格式。

logback配置

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>log/base.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>log/base.log.%d.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 64 MB -->
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>                       
        </rollingPolicy>
        <encoder>
            <pattern>
                %d %p (%file:%line\)- %m%n
            </pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="CONSOLE" />  
    </root>
    <!--<logger name="com.example" level="DEBUG">-->
    <!--<appender-ref ref="baselog" />-->
    <!--</logger>-->
</configuration>

如果后續(xù)用到更多的日志需求,再回來補充,最近看到黃勇的架構(gòu)探險上對于日志體系的分析,有很多很有意思的東西

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 3 slf4j 3.1 簡介 與commons-logging相同,slf4j也是一個通用的日志接口,在程序中與其...
    賈博巖閱讀 2,885評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 歷史 log4j可以當(dāng)之無愧地說是Java日志框架的元老,1999年發(fā)布首個版本,2012年發(fā)布最后一個版本,20...
    kelgon閱讀 10,288評論 3 53
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,842評論 0 3

友情鏈接更多精彩內(nèi)容