SpringBoot中日志詳解(一)

參考官方日志文檔鏈接1
參考官方日志文檔鏈接2
http://www.51gjie.com/javaweb/1096.html

1.日志框架基本介紹

常見的日志框架:JUL、JCL了赌、Jboss-logging诡宗、logback、log4j巴比、log4j2、slf4j...

  • JCL(Jakarta Commons Logging) :spring 底層所使用的日志框架
  • JUL(java.util.logging) :java提供的日志框架礁遵,是JDK在1.4版本中引入的Java原生日志框架
  • Jboss-logging :就是jboss提供的日志框架(hibernate)
  • log4j :Apache的一個開源項目轻绞,可以控制日志信息輸送的目的地是控制臺、文件佣耐、GUI組件等政勃,可以控制每一條日志的輸出格式,這些可以通過一個配置文件來靈活地進行配置兼砖,而不需要修改應(yīng)用的代碼奸远。雖然已經(jīng)停止維護了,但目前絕大部分企業(yè)都是用的log4j讽挟。
  • logback :是由 Log4j 的作者設(shè)計完成的懒叛,擁有更好的特性,用來取代 Log4j 的一個日志框架耽梅,是 SLF4j 的原生實現(xiàn)
  • log4j2:已經(jīng)不僅僅是 Log4j 的一個升級版本了薛窥,它從頭到尾都被重寫了。由于使用了 LMAX Disruptor 技術(shù)(無鎖異步)眼姐,使得日志的吞吐量诅迷、性能比 log4j 1.x 提高 10 倍,并解決了一些死鎖的 bug众旗,而且配置更加簡單靈活罢杉。
  • slf4j(Simple Logging Facade for Java ):簡單的日志框架,也是logback 贡歧,log4j 的作者寫的屑那,主要是目前日志的抽象層
日志門面 (日志的抽象層) 日志實現(xiàn)
JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)艘款、jboss-logging Log4j 持际、JUL(java.util.logging)、Log4j2 哗咆、Logback

2.springboot日志框架選擇

SpringBoot 默認(rèn)選擇的是 SLF4J + Logback 的組合蜘欲,本篇文章講解的是默認(rèn)的日志
在實際項目中我們可以整合 Log4j2 來代替原來的 Logback(形成 SLF4J + Log4j2 組合)。采用 Log4j2 有如下幾個優(yōu)點:

  • 相比與其他的日志系統(tǒng)晌柬,log4j2 丟數(shù)據(jù)的情況少姥份;
  • 采用 disruptor 技術(shù)郭脂,在多線程環(huán)境下,性能高于 logback 等 10 倍以上(無論在同步日志模式還是異步日志模式下澈歉,在所有日志框架中 log4j2 性能都是最佳的)展鸡;
  • 利用 jdk1.5 并發(fā)的特性,減少了死鎖的發(fā)生埃难;

3.日志級別

trace<debug<info<warn<error<fatal
??:Logback does not have a FATAL level. It is mapped to ERROR.(Logback沒有FATAL級別莹弊,映射到ERROR)

//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
    //日志的級別;
    //由低到高   trace<debug<info<warn<error
    //可以調(diào)整輸出的日志級別涡尘;日志就只會在這個級別以以后的高級別生效
    logger.trace("這是trace日志...");
    logger.debug("這是debug日志...");
    //SpringBoot默認(rèn)給我們使用的是info級別的忍弛,沒有指定級別的就用SpringBoot默認(rèn)規(guī)定的級別;root級別(默認(rèn)只有下面輸出信息)
    logger.info("這是info日志...");
    logger.warn("這是warn日志...");
    logger.error("這是error日志...");
}

4.maven依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
依賴關(guān)系

5.控制臺輸出基本介紹

2019-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

輸出內(nèi)容:
? 時間日期:精確到毫秒考抄,易于排序
? 日志級別:ERROR, WARN, INFO, DEBUG ,TRACE
? 進程ID:圖中45469
? 分隔符:--- 分隔符用于區(qū)分實際日志消息的開始
? 線程名:方括號括起來(在控制臺輸出時可能被截斷细疚,也就是展示不全)
? Logger名:通常使用源代碼的類名(通常縮寫)
? ?日志消息

6.顏色配置

如果你的終端支持ANSI川梅,彩色輸出是用來幫助可讀性疯兼。你可以設(shè)置spring.output.ansi.enabled來改變默認(rèn)的自動檢測(detect):設(shè)置值

  • ALWAYS
    開啟彩色輸出
  • DETECT
    嘗試檢測ANSI 顏色是否支持
  • NEVER
    關(guān)閉彩色輸出

彩色編碼使用%clr轉(zhuǎn)換字配置,最簡單的情勢是根據(jù)日志級別進行色彩輸出贫途,例如:

%clr(%5p)

日志級別到顏色的映射:

Level Color
FATAL Red
ERROR Red
WARN Yellow
INFO Green
DEBUG Green
TRACE Green

你可以通過在轉(zhuǎn)換器中提供選項來指定應(yīng)當(dāng)試用的色彩或風(fēng)格吧彪。例如,為了使文本顯示黃色:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

支持的顏色:
? blue
? cyan
? faint
? green
? magenta
? red
? yellow

7.SpringBoot修改日志的默認(rèn)配置

① 設(shè)置日志級別

logging.level設(shè)置日志級別潮饱,后面跟生效的區(qū)域,比如root表示整個項目诫给,也可以設(shè)置為某個包下香拉,也可以具體到某個類名(日志級別的值不區(qū)分大小寫)

#日志的最低輸出級別調(diào)整,設(shè)置在com.xx包下
logging.level.com.xx=trace
#root日志以WARN級別輸出(讓日志只輸出warn及以上級別的信息)
logging.level.root=warn
#springframework.web日志以DEBUG級別輸出
logging.level.org.springframework.web=DEBUG
#hibernate日志以ERROR級別輸出
logging.level.org.hibernate=ERROR

② 日志路徑

# logging.path=
# 不指定路徑在當(dāng)前項目下生成springboot.log日志
# 可以指定完整的路徑;
# logging.file=/usr/xx/springboot.log

# 主要用這種形式
# 在當(dāng)前磁盤的根路徑下創(chuàng)建spring文件夾和里面的log文件夾中狂;使用 spring.log 作為默認(rèn)文件
logging.path=/spring/log

# 在控制臺輸出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logging.file logging.path Example Description
(none) (none) 只在控制臺輸出
指定文件名 (none) my.log 輸出日志到my.log文件(可以是絕對路徑凫碌,也可以是相對路徑)
(none) 指定目錄 /var/log 輸出到指定目錄的 spring.log 文件中
指定文件名 指定目錄 輸出到文件名,前一個配置生效

當(dāng)日志文件到達(dá)10Mb時會循環(huán)保存胃榕。文件的大小限制可通過logging.file.max-size屬性設(shè)置盛险。之前保存的日志文件會無限期存檔,除非配置logging.file.max-history屬性

③ 日志輸出格式

%d:表示日期時間勋又,
%thread:表示線程名苦掘,
%-5level:級別從左顯示5個字符寬度,
%logger{50}:表示logger名字最長50個字符,否則按照句點分割楔壤。
%msg:日志消息鹤啡,
%n:換行符

實例:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

8.自定義日志配置

① 配置文件名稱

在xml文件中,指定日志文件

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

建議將-spring變體用于日志記錄配置(例如蹲嚣,logback-spring.xml而不是logback.xml)递瑰。如果使用標(biāo)準(zhǔn)配置位置祟牲,Spring將無法完全控制日志初始化
如果你既想完全掌控日志配置,但又不想用logback.xml作為Logback配置的名字抖部,可以通過logging.config屬性指定自定義的名字:

logging.config=classpath:logback-config.xml 
  • Spring Boot包含了許多可以幫助進行高級配置的Logback擴展,您可以在logback-spring.xml配置文件中使用這些擴展名
  • 由于標(biāo)準(zhǔn)的logback.xml配置文件加載的太早说贝,所以你不能在里面使用擴展部分,您需要使用logback-spring.xml或定義一個logging.config屬性

② springProfile標(biāo)簽針對不同開發(fā)環(huán)境

使用<springProfile>標(biāo)簽,您可以根據(jù)活動的Spring配置文件選擇包括或排除配置部分

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

③ Environment Properties

該<springProperty>標(biāo)簽允許您公開來自Spring環(huán)境的屬性慎颗,以便在Logback中使用乡恕。如果要從application.properties中訪問文件中的值,這樣做很有用哗总。該標(biāo)簽的工作方式與Logback的<property>標(biāo)簽類似几颜。但是,不是指定直接的值value讯屈,而是指定屬性的源source(來自Environment)蛋哭。如果需要將該屬性存儲在局部作用域之外的其他地方,則可以使用scope屬性涮母。如果需要回退值(在Environment中沒有設(shè)置該屬性的情況下)谆趾,可以使用defaultValue屬性。以下示例顯示如何公開用于Logback的屬性

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
        defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>

④ 配置詳解

<?xml version="1.0" encoding="UTF-8"?>
<!--
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  scan="true" scanPeriod="60 seconds" debug="false">
    <!--每個logger都關(guān)聯(lián)到logger上下文,默認(rèn)上下文名稱為“default”赂弓。但可以使用設(shè)置成其他名字绑榴,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置盈魁,不能修改,可以通過%contextName來打印日志上下文名稱 -->
    <contextName>logback</contextName>
    <!--property:用來定義變量值的標(biāo)簽彭沼, 有兩個屬性,name和value备埃;其中name的值是變量的名稱姓惑,value的值時變量定義的值褐奴。通過定義的值會被插入到logger上下文中。定義變量后于毙,可以使“${}”來使用變量-->
    <property name="LOG_PATH" value="/usr/xx/log.log" />
    <!--從配置文件中讀取logging.path屬性值-->
    <springProperty name="LOG_HOME" source="logging.path"/>

    <!--在pattern中直接用${pattern_format}調(diào)用公共部分-->
    <property name="pattern_format" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n" />

    <!-- <appender>:用來格式化日志輸出節(jié)點敦冬,有兩個屬性name和class,class用來指定哪種輸出策略唯沮,常用就是控制臺輸出策略和文件輸出策略脖旱。-->

    <!--輸出到控制臺 ConsoleAppender -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--ThresholdFilter為系統(tǒng)定義的攔截器,此日志appender是為開發(fā)使用,只配置最低級別介蛉,此配置表示控制臺輸出的日志級別是大于或等于此級別的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--設(shè)置輸出格式 class可省略-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期萌庆,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息币旧,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--配置顏色践险,可使用下面-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %blue(%logger{50}) - %highlight(%msg) %n</pattern>
            <!--設(shè)置編碼,可省略-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--輸出到文件,時間窗口滾動-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志名,指定最新的文件名吹菱,其他文件名使用FileNamePattern -->
        <File>${LOG_PATH}/info.log</File>
        <!--文件滾動模式-->
        <!--第一種-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件輸出的文件名,可設(shè)置文件類型為gz,開啟文件壓縮,初始i為0-->
            <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天數(shù),也就是過期時間-->
            <MaxHistory>15</MaxHistory>
            <!--單個日志文件最大值巍虫,達(dá)到之后就進行切割-->
            <maxFileSize>10MB</maxFileSize>
            <!--日志文件總體的最大值,達(dá)到之后鳍刷,就會刪除舊的日志-->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>

       <!--關(guān)系:SizeAndTimeBasedRollingPolicy extends TimeBasedRollingPolicy-->
       <!--第二種占遥,因TimeBasedRollingPolicy下沒有maxFileSize,像上面那樣配置后會報錯-->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>15</MaxHistory>
            <totalSizeCap>1GB</totalSizeCap>

            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!--
             上面配置意思:每天產(chǎn)生一個日志文件输瓜,如果超出了10M瓦胎,日志就進行切割,并且在日志文件名稱上加一,新的日志存入新的i++文件中尤揣;
             日志文件最多保持15天搔啊,日志文件總共最大為1G;
             當(dāng)超過1G時候芹缔,刪除舊的日志文件坯癣,在我測試時候發(fā)現(xiàn)瓶盛,如果某天的日志文件分割了最欠,會先刪除i=1的,再刪除i=0惩猫,接著i=2,3....
        -->

        <!--輸出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--設(shè)置編碼,可省略-->
            <charset>UTF-8</charset>
        </encoder>

        <!-- 過濾器芝硬,過濾掉不是指定日志水平的日志,精確定位 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 設(shè)置日志級別 -->
            <level>INFO</level>
            <!-- 如果跟該日志水平相匹配轧房,則接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 如果跟該日志水平不匹配拌阴,則過濾掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 指定主日志輸出級別,只有一個level屬性-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
    
    <!--<loger>指定自定義日志的級別奶镶,有name,level,addtivity屬性-->
    <!-- logback為java中的包 -->
    <logger name="com.xx.controller"/>
    <!--
    name:用來指定受此loger約束的某一個包或者具體的某一個類迟赃。
    level:用來設(shè)置打印級別陪拘,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還        有一個特俗值INHERITED或者同義詞NULL纤壁,代表強制執(zhí)行上級的級別左刽。如果未設(shè)置此屬性,那么當(dāng)前l(fā)oger將會繼承上級的級別酌媒。
    addtivity:是否向上級loger傳遞打印信息欠痴。默認(rèn)是true。
    -->
    <logger name="com.xx.controller.SpringController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration> 

root 指定的日志級別就是用類進行輸出的日志,例如:

private static Logger log = LoggerFactory.getLogger(logbackTest.class);

⑤ loger的使用:

public class TestController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @GetMapping("/show")
    public void show() {
        logger.trace("這是trace日志...");
        logger.debug("這是debug日志...");
        logger.info("這是info日志...");
        logger.warn("這是warn日志...");
        logger.error("這是error日志...");
    }
}
<root level="info">
    <appender-ref ref="console" />
</root>
  • 第一種:帶有l(wèi)oger的配置秒咨,不指定級別喇辽,不指定appender
<logger name="com.mine.demo"/>
將控制demo包下的所有類的日志的打印,但是并沒用設(shè)置打印級別雨席,所以繼承他的上級的日志級別,即root的級別“info”菩咨;
沒有設(shè)置addtivity,默認(rèn)為true舅世,將此loger的打印信息向上級傳遞旦委,設(shè)置為false時候,執(zhí)行/show雏亚,show()方法執(zhí)行缨硝,但是不打印日志信息;
沒有設(shè)置appender罢低,此loger本身不打印任何信息查辩。
當(dāng)執(zhí)行該包下的某個類中的功能時,將方法內(nèi)所有日志信息傳遞給root网持,本身并不打右说骸;
root接到下級傳遞的信息功舀,交給已經(jīng)配置好的名為“console”的appender處理萍倡,“console”appender將信息打印到控制臺。

此配置類似:<logger name="com.mine.demo.TestDemoController" level="info" additivity="true">

結(jié)果:
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] INFO  com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] WARN  com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:03:57.681 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...

當(dāng)additivity=false時候辟汰,本身打印列敲,但是沒有設(shè)置appender,此loger本身不打印任何信息帖汞。
  • 第二種:帶有多個loger的配置戴而,指定級別,指定appender
<logger name="com.mine.demo.TestDemoController" level="WARN" additivity="false">
    <appender-ref ref="console"/>
</logger>
控制com.mine.demo.TestDemoController類的日志打印翩蘸,打印級別為“WARN”;
additivity屬性為false所意,表示此loger的打印信息不再向上級傳遞;
指定了名字為“console”的appender;
當(dāng)執(zhí)行TestDemoController中的方法時將級別為“WARN”及大于“WARN”的日志信息交給此loger指定的名為“console”的appender處理,在控制臺中打出日志,不再向上級root傳遞打印信息扶踊。

結(jié)果:
2020-10-09 14:42:19.792 logback [http-nio-8080-exec-1] WARN  com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 14:42:19.792 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...

<logger name="com.mine.demo.TestDemoController" level="warn" additivity="true">
    <appender-ref ref="console"/>
</logger>
<logger name="com.mine.demo.TestDemoController" level="info" additivity="false"/>
多個個同時存在時候泄鹏,后一個覆蓋前一個,level,additivity,appender后一個有則覆蓋秧耗,沒有則使用前一個配置命满,所以上面的level="debug", additivity="false", <appender-ref ref="console"/>

結(jié)果:
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] INFO  com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:03:57.680 logback [http-nio-8080-exec-1] WARN  com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:03:57.681 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...

<root level="warn">
    <appender-ref ref="console" />
</root>
<logger name="com.mine.demo.TestDemoController" level="info" additivity="false">
    <appender-ref ref="console"/>
</logger>
結(jié)果:
2020-10-09 15:30:12.696 logback [http-nio-8080-exec-1] INFO  com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:30:12.696 logback [http-nio-8080-exec-1] INFO  com.mine.demo.TestDemoController - 這是info日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] WARN  com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] WARN  com.mine.demo.TestDemoController - 這是warn日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...
2020-10-09 15:30:12.698 logback [http-nio-8080-exec-1] ERROR com.mine.demo.TestDemoController - 這是error日志...

開始理解的時候是本身打印info級別,向上級root傳遞的時候绣版,上級是warn級別的胶台,所以打印是本身打印info級別以上的,上級只打印篩選的warn級別以上的杂抽。結(jié)果多次測試發(fā)現(xiàn)不是這樣诈唬。
后來理解:當(dāng)本身的打印日志信息傳遞給上級,上級只負(fù)責(zé)輸出缩麸。所以當(dāng)本身打印info日志铸磅,向上級root傳遞info信息,上級繼續(xù)打印info日志杭朱;打印warn日志......依次類推

9.最終配置logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 存放日志文件的路徑的根目錄 -->
    <springProperty name="log_path" source="custom.logging.path"/>

    <!--輸出到控制臺 ConsoleAppender -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--設(shè)置輸出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--文件輸出,時間窗口滾動-->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log_path}/info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <MaxHistory>15</MaxHistory>
            <maxFileSize>10MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log_path}/error.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>${log_path}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>15</maxHistory>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <!-- 此日志文檔只記錄ERROR級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="console"/>
        </root>
        <logger name="com.xx.dao" level="debug" />
    </springProfile>

    <springProfile name="test,prod">
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
</configuration>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅仔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弧械,更是在濱河造成了極大的恐慌八酒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃唐,死亡現(xiàn)場離奇詭異羞迷,居然都是意外死亡,警方通過查閱死者的電腦和手機画饥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門衔瓮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抖甘,你說我怎么就攤上這事热鞍。” “怎么了衔彻?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵薇宠,是天一觀的道長。 經(jīng)常有香客問我米奸,道長昼接,這世上最難降的妖魔是什么爽篷? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任悴晰,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铡溪。我一直安慰自己漂辐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布棕硫。 她就那樣靜靜地躺著髓涯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哈扮。 梳的紋絲不亂的頭發(fā)上纬纪,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音滑肉,去河邊找鬼包各。 笑死,一個胖子當(dāng)著我的面吹牛靶庙,可吹牛的內(nèi)容都是我干的问畅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼六荒,長吁一口氣:“原來是場噩夢啊……” “哼护姆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掏击,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卵皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砚亭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渐裂,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年钠惩,在試婚紗的時候發(fā)現(xiàn)自己被綠了柒凉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡篓跛,死狀恐怖膝捞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧沟,我是刑警寧澤蔬咬,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沐寺,受9級特大地震影響林艘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜混坞,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一狐援、第九天 我趴在偏房一處隱蔽的房頂上張望钢坦。 院中可真熱鬧,春花似錦啥酱、人聲如沸爹凹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禾酱。三九已至,卻和暖如春绘趋,著一層夾襖步出監(jiān)牢的瞬間颤陶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工陷遮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留指郁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓拷呆,卻偏偏與公主長得像闲坎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茬斧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355