SpringBoot整合日志框架

1 Slf4j門面技術(shù)

SpringBoot采用日志門面技術(shù)凄吏,使得面向開發(fā)者的日志記錄API是相同的,但是實現(xiàn)層還是由每個框架來決定的。SpringBoot幫我們已經(jīng)做好了痕钢。它的日志門面選用的就是 SLF4J图柏,而日志實現(xiàn)選用的是Logback

如果log4j和JUL日志框架想采用SLF4J作為日志門面任连,還需要一層適配層蚤吹。例如,如果要使用 SLF4J 作為 log4j 的門面随抠,就必須引入 slf4j-api.jar 和 slf-4j-log412.jar 的依賴裁着。其中 slf-4j-log412.jar 就是用來做適配的,我們在調(diào)用slf4j API 的時候其實是在調(diào)用 slf-4j-log412.jar 中的API拱她,而 slf-4j-log412.jar 中的API執(zhí)行的又是 log4j中的具體方法二驰。

concrete-bindings.png

2 SpringBoot日志使用

2.1 默認(rèn)日志使用

@SpringBootTest
@RunWith(SpringRunner.class)
public class LogTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogTest.class);

    @Test
    public void test() {
        //日志的級別;
        //由低到高   trace<debug<info<warn<error
        //可以調(diào)整輸出的日志級別椭懊;日志就只會在這個級別以以后的高級別生效
        LOGGER.trace("這是trace日志...");
        LOGGER.debug("這是debug日志...");
        //SpringBoot默認(rèn)給我們使用的是info級別的诸蚕,沒有指定級別的就用SpringBoot默認(rèn)規(guī)定的級別步势;root級別
        LOGGER.info("這是info日志...");
        LOGGER.warn("這是warn日志...");
        LOGGER.error("這是error日志...");

    }
}

Result:

2021-10-17 16:53:46.009  INFO 37983 --- [           main] com.ustb.softverify.LogTest              : 這是info日志...
2021-10-17 16:53:46.009  WARN 37983 --- [           main] com.ustb.softverify.LogTest              : 這是warn日志...
2021-10-17 16:53:46.009 ERROR 37983 --- [           main] com.ustb.softverify.LogTest              : 這是error日志...

2.2 指定配置的日志

  • logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL氧猬,如果設(shè)置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan:當(dāng)此屬性設(shè)置為true時坏瘩,配置文檔如果發(fā)生改變盅抚,將會被重新加載,默認(rèn)值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測配置文檔是否有修改的時間間隔倔矾,如果沒有給出時間單位妄均,默認(rèn)單位是毫秒。
             當(dāng)scan為true時哪自,此屬性生效丰包。默認(rèn)的時間間隔為1分鐘。 -->
<!-- debug:當(dāng)此屬性設(shè)置為true時壤巷,將打印出logback內(nèi)部日志信息邑彪,實時查看logback運行狀態(tài)。默認(rèn)值為false胧华。 -->
<configuration>
    <contextName>logback-spring</contextName>

    <!-- name的值是變量的名稱寄症,value的值時變量定義的值。通過定義的值會被插入到logger上下文中矩动。定義后有巧,可以使“${}”來使用變量。 -->
    <property name="logging.path" value="logs" />

    <!--0. 日志格式和顏色渲染 -->
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--1. 輸出到控制臺-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是為開發(fā)使用悲没,只配置最底級別篮迎,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 設(shè)置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--2. 輸出到文檔-->
    <!-- 2.1 level為 DEBUG 日志,時間滾動輸出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文檔的路徑及文檔名 -->
        <file>${logging.path}/web_debug.log</file>
        <!--日志文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 設(shè)置字符集 -->
        </encoder>
        <!-- 日志記錄器的滾動策略,按日期甜橱,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志歸檔 -->
            <fileNamePattern>${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文檔保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文檔只記錄debug級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.2 level為 INFO 日志享言,時間滾動輸出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文檔的路徑及文檔名 -->
        <file>${logging.path}/web_info.log</file>
        <!--日志文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志記錄器的滾動策略,按日期渗鬼,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志歸檔路徑以及格式 -->
            <fileNamePattern>${logging.path}/web-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文檔保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文檔只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.3 level為 WARN 日志览露,時間滾動輸出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文檔的路徑及文檔名 -->
        <file>${logging.path}/web_warn.log</file>
        <!--日志文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
        <!-- 日志記錄器的滾動策略,按日期譬胎,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文檔保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文檔只記錄warn級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.4 level為 ERROR 日志差牛,時間滾動輸出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文檔的路徑及文檔名 -->
        <file>${logging.path}/web_error.log</file>
        <!--日志文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
        <!-- 日志記錄器的滾動策略,按日期堰乔,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logging.path}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文檔保留天數(shù)-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文檔只記錄ERROR級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        <logger>用來設(shè)置某一個包或者具體的某一個類的日志打印級別偏化、
        以及指定<appender>。<logger>僅有一個name屬性镐侯,
        一個可選的level和一個可選的addtivity屬性侦讨。
        name:用來指定受此logger約束的某一個包或者具體的某一個類。
        level:用來設(shè)置打印級別苟翻,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF韵卤,
              還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別崇猫。
              如果未設(shè)置此屬性沈条,那么當(dāng)前l(fā)ogger將會繼承上級的級別。
        addtivity:是否向上級logger傳遞打印信息诅炉。默認(rèn)是true蜡歹。
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
    -->

    <!--
        使用mybatis的時候,sql語句是debug下才會打印涕烧,而這里我們只配置了info月而,所以想要查看sql語句的話,有以下兩種操作:
        第一種把<root level="info">改成<root level="DEBUG">這樣就會打印sql议纯,不過這樣日志那邊會出現(xiàn)很多其他消息
        第二種就是單獨給dao下目錄配置debug模式父款,代碼如下,這樣配置sql語句會打印痹扇,其他還是正常info級別:
        【logging.level.org.mybatis=debug logging.level.dao=debug】
     -->

    <!--
        root節(jié)點是必選節(jié)點铛漓,用來指定最基礎(chǔ)的日志輸出級別,只有一個level屬性
        level:用來設(shè)置打印級別鲫构,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF浓恶,
        不能設(shè)置為INHERITED或者同義詞NULL。默認(rèn)是DEBUG
        可以包含零個或多個元素结笨,標(biāo)識這個appender將會添加到這個logger包晰。
    -->

    <!-- 4. 最終的策略 -->
    <!-- 4.1 開發(fā)環(huán)境:打印控制臺和文檔-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

    <!--     4.2 生產(chǎn)環(huán)境:輸出到文檔-->
    <springProfile name="pro">
        <root level="info">
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
        </root>
    </springProfile>
</configuration>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湿镀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伐憾,更是在濱河造成了極大的恐慌勉痴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件树肃,死亡現(xiàn)場離奇詭異蒸矛,居然都是意外死亡,警方通過查閱死者的電腦和手機胸嘴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門雏掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劣像,你說我怎么就攤上這事乡话。” “怎么了耳奕?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵绑青,是天一觀的道長。 經(jīng)常有香客問我屋群,道長闸婴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任谓晌,我火速辦了婚禮掠拳,結(jié)果婚禮上癞揉,老公的妹妹穿的比我還像新娘纸肉。我一直安慰自己,他們只是感情好喊熟,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布柏肪。 她就那樣靜靜地躺著,像睡著了一般芥牌。 火紅的嫁衣襯著肌膚如雪烦味。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天壁拉,我揣著相機與錄音谬俄,去河邊找鬼。 笑死弃理,一個胖子當(dāng)著我的面吹牛溃论,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痘昌,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼钥勋,長吁一口氣:“原來是場噩夢啊……” “哼炬转!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算灸,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扼劈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菲驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荐吵,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年赊瞬,在試婚紗的時候發(fā)現(xiàn)自己被綠了捍靠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡森逮,死狀恐怖榨婆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褒侧,我是刑警寧澤良风,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站闷供,受9級特大地震影響烟央,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歪脏,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一疑俭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婿失,春花似錦钞艇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懒浮,卻和暖如春飘弧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砚著。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工次伶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稽穆。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓冠王,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秧骑。 傳聞我的和親對象是個殘疾皇子版确,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容