SpringBoot 使用logback日志配置

前言

  • Logback是由log4j創(chuàng)始人設(shè)計(jì)的又一個開源日志組件扳还。logback當(dāng)前分成三個模塊:logback-core,logback- classic和logback-access氨距。logback-core是其它兩個模塊的基礎(chǔ)模塊。logback-classic是log4j的一個 改良版本楞遏。
  • SpringBoot會默認(rèn)使用logback作為日志框架寡喝。SpringBoot會默認(rèn)加載classpath:logback.xml或者classpath:logback-spring.xml文件作為日志配置文件勒奇。如果兩個文件都不存在撬陵,logback 用 BasicConfigurator 自動對自己進(jìn)行配置珊皿,這會導(dǎo)致記錄輸出到控制臺网缝。

一、pom.xml文件

因?yàn)閟pringboot默認(rèn)使用logback作為日志框架蟋定,所以我們不需要再引入依賴粉臊,這里引入lombok是為了方便使用logback,下面會有例子驶兜。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

二扼仲、logback配置文件

這里的錯誤日志單獨(dú)生成一個文件。具體配置可以參考logback中文手冊

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextName>SpringBoot-logback</contextName>
    <!--設(shè)置系統(tǒng)日志目錄-->
    <property name="log-dir" value="logs"/>
    <property name="log-name" value="spring-boot-logback"/>

    <!-- 控制臺輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder 默認(rèn)配置為PatternLayoutEncoder-->
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!--此日志appender是為開發(fā)使用屠凶,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 日志記錄器肆资,日期滾動記錄 -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志名稱矗愧,如果沒有File 屬性,那么只會使用FileNamePattern的文件路徑規(guī)則如果同時有<File>和<FileNamePattern>郑原,那么當(dāng)天日志是<File>唉韭,明天會自動把今天的日志改名為今天的日期。即犯犁,<File> 的日志都是當(dāng)天的属愤。-->
        <!--<File>${log-dir}/${log-name}/info.spring-boot-demo-logback.log</File>-->

        <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間-->
            <FileNamePattern>${log-dir}/${log-name}/info.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <!--用來指定日志文件的上限大小酸役,那么到了這個值住诸,就會刪除舊的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:這是活動文件的大小,默認(rèn)值是10MB,本篇設(shè)置為1KB涣澡,只是為了演示 -->
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--如果只是想要 Info 級別的日志贱呐,只是過濾 info 還是會輸出 Error 日志,因?yàn)?Error 的級別高暑塑, 所以我們使用下面的策略吼句,可以避免輸出 Error 的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--過濾 Error-->
            <level>ERROR</level>
            <!--匹配到就禁止-->
            <onMatch>DENY</onMatch>
            <!--沒有匹配到就允許-->
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <!--日志文件最大的大小-->
        <!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
        <!--<maxFileSize>1KB</maxFileSize>-->
        <!--</triggeringPolicy>-->
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
    </appender>

    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!--日志名稱锅必,如果沒有File 屬性事格,那么只會使用FileNamePattern的文件路徑規(guī)則如果同時有<File>和<FileNamePattern>,那么當(dāng)天日志是<File>搞隐,明天會自動把今天的日志改名為今天的日期驹愚。即,<File> 的日志都是當(dāng)天的劣纲。-->
        <!--<File>logs/error.spring-boot-demo-logback.log</File>-->
        <!--滾動策略逢捺,按照時間滾動 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間-->
            <FileNamePattern>${log-dir}/${log-name}/error.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>90</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:這是活動文件的大小,默認(rèn)值是10MB,本篇設(shè)置為1KB癞季,只是為了演示 -->
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--如果只是想要 Error 級別的日志劫瞳,那么需要過濾一下倘潜,默認(rèn)是 info 級別的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>Error</level>
        </filter>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設(shè)置字符集 -->
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/>
        <appender-ref ref="FILE_ERROR"/>
    </root>
</configuration>

三志于、Controller類

  • 未使用lombok方式涮因。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    // logback
    private final static Logger logger = LoggerFactory.getLogger(IndexController.class);

    @RequestMapping("/index")
    public String index() {
        logger.debug("記錄debug日志");
        logger.info("訪問了index方法");
        logger.error("記錄了error錯誤日志");
        return "index";
    }
}
  • 使用lombok方式。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class IndexController2 {

    @RequestMapping("/index2")
    public String index2() {
        log.trace("記錄trace日志");
        log.debug("記錄debug日志");
        log.info("訪問了index方法");
        log.warn("記錄了warn日志");
        log.error("記錄了error錯誤日志");

        try {
            int i = 0;
            int j = 1 / i;
        } catch (Exception e) {
            log.error("錯誤異常:", e);
        }
        return "index";
    }
}

四伺绽、備注

為了加深理解logback配置养泡,這里放一個搜到的比較好的一個配置,僅供參考奈应。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
       說明:
       1澜掩、日志級別及文件
           日志記錄采用分級記錄,級別與日志文件名相對應(yīng)杖挣,不同級別的日志信息記錄到不同的日志文件中
           例如:error級別記錄到log_error_xxx.log或log_error.log(該文件為當(dāng)前記錄的日志文件)肩榕,而log_error_xxx.log為歸檔日志,
           日志文件按日期記錄惩妇,同一天內(nèi)点把,若日志文件大小等于或大于2M,則按0屿附、1郎逃、2...順序分別命名
           例如log-level-2013-12-21.0.log
           其它級別的日志也是如此。
       2挺份、文件路徑
           若開發(fā)褒翰、測試用,在Eclipse中運(yùn)行項(xiàng)目匀泊,則到Eclipse的安裝路徑查找logs文件夾优训,以相對路徑../logs。
           若部署到Tomcat下各聘,則在Tomcat下的logs文件中
       3揣非、Appender
           FILEERROR對應(yīng)error級別,文件名以log-error-xxx.log形式命名
           FILEWARN對應(yīng)warn級別躲因,文件名以log-warn-xxx.log形式命名
           FILEINFO對應(yīng)info級別早敬,文件名以log-info-xxx.log形式命名
           FILEDEBUG對應(yīng)debug級別,文件名以log-debug-xxx.log形式命名
           stdout將日志信息輸出到控制上大脉,為方便開發(fā)測試使用
    -->
    <contextName>SpringBootDemo</contextName>
    <property name="LOG_PATH" value="D:\\JavaWebLogs" />
    <!--設(shè)置系統(tǒng)日志目錄-->
    <property name="APPDIR" value="SpringBootDemo" />

    <!-- 日志記錄器搞监,日期滾動記錄 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <!-- 日志記錄器的滾動策略,按日期镰矿,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日志文件的路徑琐驴,例如今天是2013-12-21日志,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑绝淡,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄宙刘。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式牢酵,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志記錄之外荐类,還配置了日志文件不能超過2M,若超過2M茁帽,日志文件會以索引0開始玉罐,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日志記錄器潘拨,日期滾動記錄 -->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <!-- 日志記錄器的滾動策略吊输,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日志文件的路徑铁追,例如今天是2013-12-21日志季蚂,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑琅束,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄扭屁。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式涩禀,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志記錄之外料滥,還配置了日志文件不能超過2M,若超過2M艾船,日志文件會以索引0開始葵腹,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 日志記錄器屿岂,日期滾動記錄 -->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日志文件的路徑及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <!-- 日志記錄器的滾動策略践宴,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔的日志文件的路徑爷怀,例如今天是2013-12-21日志阻肩,當(dāng)前寫的日志文件路徑為file節(jié)點(diǎn)指定,可以將此文件與file指定文件路徑設(shè)置為不同路徑运授,從而將當(dāng)前日志文件或歸檔日志文件置不同的目錄烤惊。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式徒坡,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志記錄之外撕氧,還配置了日志文件不能超過2M瘤缩,若超過2M喇完,日志文件會以索引0開始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式記錄日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder 默認(rèn)配置為PatternLayoutEncoder-->
        <encoder>
            <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是為開發(fā)使用锦溪,只配置最底級別不脯,控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
    </appender>

    <logger name="org.springframework" level="WARN" />
    <logger name="org.hibernate" level="WARN" />

    <!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別刻诊,以免日志文件太多或影響程序性能 -->
    <root level="INFO">
        <appender-ref ref="FILEERROR" />
        <appender-ref ref="FILEWARN" />
        <appender-ref ref="FILEINFO" />

        <!-- 生產(chǎn)環(huán)境將請stdout,testfile去掉 -->
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末防楷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子则涯,更是在濱河造成了極大的恐慌复局,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粟判,死亡現(xiàn)場離奇詭異亿昏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)档礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門角钩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呻澜,你說我怎么就攤上這事递礼。” “怎么了羹幸?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵脊髓,是天一觀的道長。 經(jīng)常有香客問我栅受,道長供炼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任窘疮,我火速辦了婚禮袋哼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闸衫。我一直安慰自己涛贯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布蔚出。 她就那樣靜靜地躺著弟翘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骄酗。 梳的紋絲不亂的頭發(fā)上稀余,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音趋翻,去河邊找鬼睛琳。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的师骗。 我是一名探鬼主播历等,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辟癌!你這毒婦竟也來了寒屯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤黍少,失蹤者是張志新(化名)和其女友劉穎寡夹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂置,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡要出,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了农渊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患蹂。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砸紊,靈堂內(nèi)的尸體忽然破棺而出传于,到底是詐尸還是另有隱情,我是刑警寧澤醉顽,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布沼溜,位于F島的核電站,受9級特大地震影響游添,放射性物質(zhì)發(fā)生泄漏系草。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一唆涝、第九天 我趴在偏房一處隱蔽的房頂上張望找都。 院中可真熱鬧,春花似錦廊酣、人聲如沸能耻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晓猛。三九已至,卻和暖如春凡辱,著一層夾襖步出監(jiān)牢的瞬間戒职,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工透乾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洪燥,地道東北人磕秤。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚓曼,于是被迫代替她去往敵國和親亲澡。 傳聞我的和親對象是個殘疾皇子钦扭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348