1. 程式人生 > >Spring Boot 2.0 整合日誌框架

Spring Boot 2.0 整合日誌框架

一、前言

在Spring Boot的官方文件中,我們發現關於日誌的描述還是比較詳細的:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-logging 。Spring Boot使用Commons Logging進行所有內部日誌記錄,但是預設配置也提供了對常用日誌框架的支援,如:Java Util Logging,Log4J, Log4J2和Logback。每種日誌框架都可以通過配置使用控制檯或者檔案輸出日誌內容。如果我們使用了Spring Boot的starters,那麼Spring Boot會用Logback來記錄日誌並用INFO級別輸出到控制檯。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.2.RELEASE)

2018-08-07 21:29:38.556
INFO 4384 --- [ main] com.dudu.Application : Starting Application on DESKTOP-GVTQ3ND with PID 4384 (E:\IntelliProject\springboot_springclould\SpringBootDemo-master\chapter7-1\target\classes started by acer in E:\IntelliProject\springboot_springclould\SpringBootDemo-master\chapter7-1
) 2018-08-07 21:29:38.560 INFO 4384 --- [ main] com.dudu.Application : No active profile set, falling back to default profiles: default 2018-08-07 21:29:39.045 INFO 4384 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]5e57643e: startup date [Tue Aug 07 21:29:39 CST 2018]; root of context hierarchy 2018-08-07 21:29:40.770 INFO 4384 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 2018-08-07 21:29:40.779 INFO 4384 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 2018-08-07 21:29:40.780 INFO 4384 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.11 2018-08-07 21:29:40.877 INFO 4384 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-08-07 21:29:40.877 INFO 4384 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1836 ms 2018-08-07 21:29:41.099 INFO 4384 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2018-08-07 21:29:41.104 INFO 4384 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2018-08-07 21:29:41.104 INFO 4384 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2018-08-07 21:29:41.104 INFO 4384 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2018-08-07 21:29:41.104 INFO 4384 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2018-08-07 21:29:41.465 INFO 4384 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]5e57643e: startup date [Tue Aug 07 21:29:39 CST 2018]; root of context hierarchy 2018-08-07 21:29:41.521 INFO 4384 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/learn]}" onto public org.springframework.web.servlet.ModelAndView com.dudu.controller.LearnController.index() 2018-08-07 21:29:41.524 INFO 4384 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/login],methods=[POST]}" onto public java.util.Map<java.lang.String, java.lang.Object> com.dudu.controller.LearnController.login(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2018-08-07 21:29:41.527 INFO 4384 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2018-08-07 21:29:41.527 INFO 4384 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2018-08-07 21:29:41.544 INFO 4384 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/toLogin] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController] 2018-08-07 21:29:41.556 INFO 4384 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/my/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-08-07 21:29:41.557 INFO 4384 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-08-07 21:29:41.557 INFO 4384 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-08-07 21:29:41.599 INFO 4384 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2018-08-07 21:29:42.031 INFO 4384 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-08-07 21:29:42.099 INFO 4384 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2018-08-07 21:29:42.103 INFO 4384 --- [ main] com.dudu.Application : Started Application in 3.941 seconds (JVM running for 5.251)

通過控制檯日誌輸出我們發現:

  • 日期時間:精確到毫秒
  • 日誌級別:ERROR, WARN, INFO, DEBUG or TRACE
  • 程序id
  • 分隔符:—
  • 執行緒名:方括號中的內容(可能會截斷控制檯輸出)
  • Logger名:通常使用原始碼的類名
  • 日誌內容

二、使用預設日誌logback

2.1 新增依賴

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

新增這個依賴之後,Spring Boot應用將自動使用logback作為應用日誌框架,Spring Boot啟動的時候,由org.springframework.boot.logging.Logging-Application-Listener根據情況初始化並使用。但是一般在開發的時候我們沒必要引入這個依賴,因為spring-boot-starter其中包含了 spring-boot-starter-logging,例如下面的兩個依賴就包含此日誌包:

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

具體的依賴關係我們可以通過IDEA工具去檢視。

2.2 預設配置屬性

我們只需要引入相關的依賴,Spring Boot就預設做了很多的配置,一般情況下我們直接使用就可以了。當然我們也可以在配置檔案中去修改,相關屬性如下:

# LOGGING
logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback.
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.
logging.file.max-history=0 # Maximum of archive log files to keep. Only supported with the default logback setup.
logging.file.max-size=10MB # Maximum log file size. Only supported with the default logback setup.
logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.
logging.path= # Location of the log file. For instance, `/var/log`.
logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup.
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup.
logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup.
logging.pattern.level=%5p # Appender pattern for log level. Supported only with the default Logback setup.
logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.
屬性 解釋
logging.config= 日誌配置檔案的位置。例如,classpath:logback.xml。
logging.exception-conversion-word=%wEx 轉換異常時使用的轉換字。
logging.file= 設定儲存日誌的日誌檔案
logging.file.max-history=0 are neat
logging.file.max-size=10MB 設定日誌檔案最大大小
logging.level.*= 設定日誌等級
logging.path= 日誌檔案的位置,例如/var/log
logging.pattern.console= 定義列印的日誌格式
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS 設定日誌日期格式
logging.pattern.file= 定義輸出到日誌檔案的日誌格式
logging.register-shutdown-hook=false 當初始化日誌系統時,為其註冊一個關閉鉤子。

下面我們介紹幾個常用屬性的使用。

2.2.1 控制檯輸出

日誌的級別從低到高依次為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低於WARN的資訊都不會輸出。預設情況下Spring Boot使用logback(logback沒有FATAL級別),控制檯會輸出INFO及INFO以上的日誌,我們可以在配置檔案中配置debug=true或在啟動時執行$ java -jar demo.jar --debug核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日誌並不會輸出為DEBUG級別。

2.2.2 檔案輸出

預設情況下Spring Boot只會輸出日誌到控制檯,如果我們想要把日誌輸出到檔案中,我們可以通過設定logging.filelogging.path這兩個屬性來實現,二者不能同時使用,如若同時使用,則只有logging.file生效。

  • logging.file:設定檔案,絕對路徑或相對路徑都可以,例如:logging.file=mylog.log
  • logging.path: 設定目錄,會在該目錄下建立spring.log檔案,並寫入日誌內容,例如:logging.path=/my/log/,會在這個目錄下生成名為spring.log的日誌檔案

2.2.3 日誌級別控制

所有支援的日誌記錄系統都可以在Spring環境中設定記錄級別(例如在application.properties中)
格式為:logging.level.* = LEVEL,例如:

#com.simon.controller包下所有class以DEBUG級別輸出
logging.level.com.simon.controller=DEBUG
#root日誌以WARN級別輸出
logging.level.root=WARN

2.2.4 日誌輸出格式

%d:表示日期時間
%thread:表示執行緒名
%‐5level:級別從左顯示5個字元寬度      
%logger{50}:表示logger名字最長50個字元,否則按照句點分割。   
%msg:日誌訊息
%n:是換行符

示例:

# 設定在控制檯輸出的日誌的格式
logging.pattern.console=[%d{yyyy‐MM‐dd}]-[%level]-[%msg]-%logger{50}%n
# 指定檔案中日誌輸出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %level === %logger{50} ==== %msg%n

2.3 自定義日誌配置

由於日誌服務一般都在ApplicationContext建立前就初始化了,它並不是必須通過Spring的配置檔案控制。因此通過系統屬性和傳統的Spring Boot外部配置檔案依然可以很好的支援日誌控制和管理。根據不同的日誌系統,你可以按如下規則組織配置檔名,就能被正確載入:

  • 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

Spring Boot官方推薦優先使用帶有-spring的檔名作為日誌配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日誌配置檔案,spring boot可以為它新增一些spring boot特有的配置項。上面是預設的命名規則,並且放在src/main/resources下面即可。如果想完全掌控日誌配置,但又不想用logback.xml作為Logback配置的名字,可以在application.properties配置檔案裡面通過logging.config屬性指定自定義的名字:

logging.config=classpath:logging-config.xml

下面我們通過一個簡單的例子來說明自定義logback日誌:

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>demo</contextName>
    <property name="log.path" value="/my/log" />
    <!--輸出到控制檯-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
       <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>-->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--輸出到檔案-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <!-- logback為java中的包 -->
    <logger name="com.dudu.controller"/>
    <!--logback.LogbackDemo:類的全路徑 -->
    <logger name="com.simon.controller" level="WARN" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration>

2.3.1 根節點<configuration>包含的屬性

  • scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
  • scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
  • debug:當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。

根節點<configuration>下面一共有2個屬性,3個子節點,分別是:
1. 設定上下文名稱<contextName>

每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設定成其他名字,用於區分不同應用程式的記錄。一旦設定,不能修改,可以通過%contextName來列印日誌上下文名稱。
xml
<contextName>logback</contextName>

2. 設定變數<property>

用來定義變數值的標籤, 有兩個屬性,name和value;其中name的值是變數的名稱,value的值時變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使“${}”來使用變數。
xml
<property name="log.path" value="/my/log" />

  1. 子節點一<appender>

    • 控制檯輸出ConsoleAppender

      <!--輸出到控制檯-->
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>

      ThresholdFilter為系統定義的攔截器,例如我們用ThresholdFilter來過濾掉ERROR級別以下的日誌不輸出到檔案中。

    • 檔案輸出RollingFileAppender

      另一種常見的日誌輸出到檔案,隨著應用的執行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個檔案並非一個好辦法。RollingFileAppender用於切分檔案日誌:

      <!--輸出到檔案-->
      <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
              <maxHistory>30</maxHistory>
              <totalSizeCap>1GB</totalSizeCap>
          </rollingPolicy>
          <encoder>
              <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
          </encoder>
      </appender>

    其中重要的是rollingPolicy的定義,上例中<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,<maxHistory>30</maxHistory>表示只保留最近30天的日誌,以防止日誌填滿整個磁碟空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精確到分的日誌切分方式。<totalSizeCap>1GB</totalSizeCap>用來指定日誌檔案的上限大小,例如設定為1GB的話,那麼到了這個值,就會刪除舊的日誌。

  2. 子節點二<root>

    root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。level用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設定為INHERITED或者同義詞NULL。預設是DEBUG。可以包含零個或多個元素,標識這個appender將會新增到這個logger。

    <root level="debug">
      <appender-ref ref="console" />
      <appender-ref ref="file" />
    </root>
  3. 子節點三<logger>

    <logger>用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定。僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

    • name:用來指定受此logger約束的某一個包或者具體的某一個類。
    • level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前logger將會繼承上級的級別。
    • addtivity:是否向上級logger傳遞列印資訊。預設是true。

    logger在實際使用的時候有兩種情況:

    • 帶有logger的配置,不指定級別,不指定appender

      <logger name="com.simon.controller"/>

      <logger name="com.simon.controller" />將控制controller包下的所有類的日誌的列印,但是並沒用設定列印級別,所以繼承他的上級的日誌級別info;沒有設定addtivity,預設為true,將此logger的列印資訊向上級傳遞;沒有設定appender,此logger本身不列印任何資訊。<root level="info">將root的列印級別設定為info,指定了名字為console的appender。當執行com.simon.controller下類的方法時,首先執行<logger name="com.simon.controller"/>,將級別為info及大於info的日誌資訊傳遞給root,本身並不列印;root接到下級傳遞的資訊,交給已經配置好的名為console的appender處理,console appender將資訊列印到控制檯。

    • 帶有多個logger的配置,指定級別,指定appender

      <!--logback.LogbackDemo:類的全路徑 -->
      <logger name="com.simon.controller.DemoController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
      </logger>

      控制com.simon.controller.DemoController類的日誌列印,列印級別為WARN;additivity屬性為false,表示此logger的列印資訊不再向上級傳遞;指定了名字為console的appender;這時候執行com.simon.controller.DemoController類的方法時,先執行<logger name="com.simon.controller.DemoController" level="WARN" additivity="false">,將級別為“WARN”及大於WARN的日誌資訊交給此logger指定的名為console的appender處理,在控制檯中打出日誌,不再向上級root傳遞列印資訊。當然如果你把additivity=”false”改成additivity=”true”的話,就會列印兩次,因為列印資訊向上級傳遞,logger本身列印一次,root接到後又列印一次。

2.4 多環境日誌輸出

logback.xml與logback-spring.xml是有區別的,logback.xml會直接被日誌框架識別使用,而logback-spring.xml會先經過springboot解析處理,之後才會被日誌框架使用,可以使用SpringBoot的高階Profile功能。我們可以通過不同環境來定義不同日誌的輸出,如果我們使用logback-spring.xml,那麼springProfile節點來標識配置應用到哪些環境中。

<!-- 測試環境+開發環境. 多個使用逗號隔開. -->
<springProfile name="test,dev">
    <logger name="com.simon.controller" level="info" />
</springProfile>
<!-- 生產環境. -->
<springProfile name="prod">
    <logger name="com.simon.controller" level="ERROR" />
</springProfile>

這樣之後,我們在配置中指定環境,那麼相關的日誌就生效了

# 指定環境為dev
spring.profiles.active=dev

三、 切換日誌框架

如果我們不想使用logback日誌框架,我們可以安裝如下方法做,以更換日誌框架為log4j2,並使用log4j2配置檔案進行日誌列印為例。

3.1 排除當前日誌框架,引入新的日誌框架

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!--排除預設日誌框架-->
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

<!--引入log4j2依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

3.2 定義log4j2.xml配置檔案

?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status,這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
<configuration status="WARN" monitorInterval="30">
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制檯的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日誌的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 這個會打印出所有的info及以下級別的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔-->
        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
    <loggers>
        <!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

相關推薦

Spring Boot 2.0 整合日誌框架

一、前言 在Spring Boot的官方文件中,我們發現關於日誌的描述還是比較詳細的:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-featur

Spring Boot 2.0 整合Thymeleaf 模板引擎

reporting 配置信息 name www. title 建模 type 引擎 suffix 本節將和大家一起實戰Spring Boot 2.0 和thymeleaf 模板引擎 1. 創建項目 2. 使用Spring Initlizr 快速創建Spring Boot

從零實現 Spring Boot 2.0 整合 weixin-java-mp(weixin-java-tools) 獲取 openId,用於微信授權

步驟: 一、內網穿透申請二級域名(有伺服器和域名者可略過) 二、申請微信公眾平臺測試號(有已認證的微信服務號者可略過) 三、搭建 Spring Boot 2.0 專案實現獲取openId 一、內網穿透: 因為要直接用內網本機開發除錯,微信網頁授權在回撥時要訪問本機,所以直接

spring-boot 2.0 整合 dubbo

spring-boot 2.0 整合 dubbo 新增如下依賴,需要執行 zookeeper <dependencies> <!-- Spring Boot Dubbo 依賴 --> <dependency> &

Spring Boot 2.0 整合 Mybatis

Spring Boot 2.0 整合 Mybatis分為兩種模式。一種是XML配置,一種是註解。 一、XML配置方式整合 1.1 依賴檔案 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/

Spring Boot 2.0 整合攜程Apollo配置中心

Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。 服務端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需

Spring Boot 2.0+整合Eureka+Ribbon+Config+Feign+Zuul+Hystrix+ActiveMq等

基於Spring Boot 2.0+ 簡介 一個簡單的Spring Cloud基礎框架,整合config/Eureka/Hystrix/ActiveMQ等元件 工程介紹 工程 埠 描述 cloud

spring boot 2.0整合activemq時遇到的錯誤

雖然我在網上看到別人都是這麼寫的,也成功了。 但是我卻老是報錯,報注入jmsTemplate失敗,我就決定手動註冊jmsTemplate,發現我下的maven包裡竟然沒有ActiveMQConnectionFactory這個類。 於是,我只能新增apache包。

spring boot 2.0 整合 elasticsearch NoNodeAvailableException

true color art tail com node ica clust elastic 原文地址:spring boot 2.0 整合 elasticsearch NoNodeAvailableException 原文說的有點問題,下面貼出我的配置: 碼雲項目地址:h

Spring boot 2.0 結合常用框架搭建(一)

Spring boot 2.0釋出有一段時間了,本文一系列主要是說自己在搭建框架時的一些心得體會,使用了Spring boot 2.0+Mybatis+MySql+redis+shiro等等一系列成熟框架吧!idea 建立新專案 選spring boot 2.0 ,這裡都不說

spring boot 2.0 整合redis 完整程式碼

1.建立maven專案:2.pom.xml:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/

Spring Boot 2.0.3整合Spring Batch

Batch用來做大資料處理,是一項不錯的選擇,由於公司的整體架構是Spring Boot,因此自己研究了一下兩者之間的關係。 1.在官網http://start.spring.io/,選擇MYSQL,BATCH,WEB 2.自定義MyBatchConfig類,添加註解@Configur

Spring Boot 2.0.3 JDBC整合Oracle 12

整合步驟 1. Oracle驅動引入 Oracle驅動一般不能通過maven倉庫直接下載得到,需自行下載並匯入到專案的lib目錄下,建議通過如下pom依賴引入下載的Oracle驅動 <!-- Oracle 驅動 --> <de

Spring Boot 2.0(八):Spring Boot 整合 Memcached

Memcached 介紹 Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但

Spring Cloud服務框架版本升級--JDK10+Gradle4.9+Spring Boot 2.0+Finchley.SR1

目標:原有版本升級為Spring Boot 2.0與Spring Cloud Finchley.SR1,使用gradle管理工程,搭建註冊、配置、閘道器與追蹤框架,加入k8s api微服務 環境:IntelliJ IDEA 步驟:版本升級及其說明->註冊中心框架-&

spring boot 2.0之使用spring boot

架構 spring spring boot依賴每一個spring boot的發型版本都包含了所依賴的版本,如果升級spring boot版本,其依賴也會同步更新升級。maven的用戶可以通過繼承spring-boot-starter-parent。其包含了一些合理的值的設置:1. 默認設置的編譯器為J

Spring Boot 2.0.0.M7 生產環境部署

nbsp list left print 20px package active padding over springboot 生產環境註意事項 1.去除不需要的 jar開發工具jar:spring-boot-devtools監控一定要做好權限控制或者去除控制jar:sp

Spring Boot 2.0(一):【重磅】Spring Boot 2.0權威發布

Spring Boot就在昨天Spring Boot2.0.0.RELEASE正式發布,今天早上在發布Spring Boot2.0的時候還出現一個小插曲,將Spring Boot2.0同步到Maven倉庫的時候出現了錯誤,然後Spring Boot官方又趕緊把 GitHub 上發布的 v2.0.0.RELEA

阿裏P9告訴你 Spring Boot 2.0正式發布,升還是不升呢?

Java spring spring Boot Spring帝國Spring幾乎是每一位Java開發人員都耳熟能詳的開發框架,不論您是一名初出茅廬的程序員還是經驗豐富的老司機,都會對其有一定的了解或使用經驗。在現代企業級應用架構中,Spring技術棧幾乎成為了Java語言的代名詞,那麽Spring

Spring Boot 2.0(二):Spring Boot 2.0嘗鮮-動態 Banner

版本 手動 block OS 動態 posit 下載 網站 dep Spring Boot 2.0 提供了很多新特性,其中就有一個小彩蛋:動態 Banner,今天我們就先拿這個來嘗嘗鮮。 配置依賴 使用 Spring Boot 2.0 首先需要將項目依賴包替換為剛剛發布的