SpringBoot進階教程 | 第二篇:日誌組件logback實現日誌分級打印

你是否由於項目出現問題,查找日誌文件定位錯誤花費N多時間,是否爲此苦不堪言,不要緊!如今經過這篇文章,將完全解決你的煩惱,這篇文篇介紹,如何經過logback配置文件將日誌進行分級打印,一個配置文件完全搞定日誌查找得煩惱。php

準備工做

環境:html

windows
jdk 8
maven 3.0
IDEA

構建工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>cn.zhangbox</groupId>
        <artifactId>spring-boot-study</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.zhangbox</groupId>
    <artifactId>spring-boot-log</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-logging</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

修改YML配置

#選擇哪個環境的配置
#這裏能夠在每一個環境配置redis,數據庫(mysql),消息(kafka)等相關的組件的配置
spring:
  profiles:
    active: dev

#文檔塊區分爲三個---
---
server:
  port: 8081
spring:
  profiles: dev
#日誌
logging:
#日誌配置文件位置
  config: classpath:log/logback.xml
#日誌打印位置,這裏是默認在項目根路徑下
  path: log/spring-boot-log

#文檔塊區分爲三個---
---
server:
  port: 8082
spring:
  profiles: test
#日誌
logging:
#日誌配置文件位置
  config: classpath:log/logback.xml
#日誌打印位置,這裏是默認在項目根路徑下
  path: usr/spring-boot/log/spring-boot-log

#文檔塊區分爲三個---
---
server:
  port: 8083
spring:
  profiles: prod
#日誌
logging:
#日誌配置文件位置
  config: classpath:log/logback.xml
#日誌打印位置,這裏是默認在項目根路徑下
  path: usr/spring-boot/log/spring-boot-log

建立日誌配置文件

在工程resources文件夾下新建文件夾log,並在該文件夾下建立logback.xml文件,加入如下配置:前端

<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
        <configuration scan="true" scanPeriod="10 seconds">
            <!--繼承spring boot提供的logback配置-->
            <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
        
            <!--設置系統日誌目錄-->
            <property name="APP_DIR" value="spring-boot-log"/>
        
            <!-- 彩色日誌 -->
            <!-- 彩色日誌依賴的渲染類 -->
            <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}}"/>
        
            <!-- 控制檯輸出 -->
            <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                    <charset>UTF-8</charset> <!-- 此處設置字符集 -->
                </encoder>
                <!--此日誌appender是爲開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌信息-->
                <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                    <level>debug</level>
                </filter>
            </appender>
        
            <!-- 時間滾動輸出 level爲 DEBUG 日誌 -->
            <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <!-- 正在記錄的日誌文件的路徑及文件名 -->
                <file>${LOG_PATH}/log_debug.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">
                    <!--
                        歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
                        而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
                    -->
                    <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <!--
                        除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始,
                        命名日誌文件,例如log-error-2017-04-26.0.log
                    -->
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>500MB</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <!--日誌文件保留天數-->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
                <!-- 此日誌文件只記錄debug級別的 -->
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>debug</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
        
            <!-- 時間滾動輸出 level爲 INFO 日誌 -->
            <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <!-- 正在記錄的日誌文件的路徑及文件名 -->
                <file>${LOG_PATH}/log_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">
                    <!--
                        歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
                        而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
                    -->
                    <fileNamePattern>${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <!--
                        除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始,
                        命名日誌文件,例如log-error-2017-04-26.0.log
                    -->
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>500MB</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <!--日誌文件保留天數-->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
                <!-- 此日誌文件只記錄info級別的 -->
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>info</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
        
            <!-- 時間滾動輸出 level爲 WARN 日誌 -->
            <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <!-- 正在記錄的日誌文件的路徑及文件名 -->
                <file>${LOG_PATH}/log_warn.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">
                    <!--
                        歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
                        而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
                    -->
                    <fileNamePattern>${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <!--
                        除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始,
                        命名日誌文件,例如log-error-2017-04-26.0.log
                    -->
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>500MB</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <!--日誌文件保留天數-->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
                <!-- 此日誌文件只記錄warn級別的 -->
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>warn</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
        
            <!-- 時間滾動輸出 level爲 ERROR 日誌 -->
            <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <!-- 正在記錄的日誌文件的路徑及文件名 -->
                <file>${LOG_PATH}/log_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">
                    <!--
                        歸檔的日誌文件的路徑,例現在天是2017-04-26日誌,當前寫的日誌文件路徑爲file節點指定,能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。
                        而2017-04-26的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
                    -->
                    <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <!--
                        除按日誌記錄以外,還配置了日誌文件不能超過500M,若超過500M,日誌文件會以索引0開始,
                        命名日誌文件,例如log-error-2017-04-26.0.log
                    -->
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <maxFileSize>500MB</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <!--日誌文件保留天數-->
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
                <!-- 此日誌文件只記錄ERROR級別的 -->
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>error</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
        
            <logger name="org.springframework.web" level="info"/>
            <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
            <logger name="cn.zhangbox.springboot" level="debug"/>
        
            <!--開發環境:打印控制檯-->
            <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>
        
            <!--測試環境:打印控制檯和輸出到文件-->
            <springProfile name="test">
                <root level="info">
                    <appender-ref ref="CONSOLE"/>
                    <appender-ref ref="INFO_FILE"/>
                    <appender-ref ref="WARN_FILE"/>
                    <appender-ref ref="ERROR_FILE"/>
                </root>
            </springProfile>
        
            <!--生產環境:輸出到文件-->
            <springProfile name="prod">
                <root level="error">
                    <appender-ref ref="CONSOLE"/>
                    <appender-ref ref="DEBUG_FILE"/>
                    <appender-ref ref="INFO_FILE"/>
                    <appender-ref ref="ERROR_FILE"/>
                </root>
            </springProfile>
        
        </configuration>

注意loback配置文件中java

<logger name="cn.zhangbox.springboot" level="debug"/>

name的屬性值必定要是當前工程的java代碼的完整目錄,由於mybatis打印的日誌級別是debug級別的,所以須要配置debug級別日誌掃描的目錄。python

建立啓動類

@SpringBootApplication
    public class SpringBootConfigApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootConfigApplication.class, args);
        }
    }

控制檯打印

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

2018-07-05 15:05:13.680  INFO 15060 --- [           main] c.z.s.SpringBootLoggingApplication       : Starting SpringBootLoggingApplication on MS-20180428GSYE with PID 15060 (started by Administrator in D:\開源項目\spring-boot-study)
2018-07-05 15:05:13.685 DEBUG 15060 --- [           main] c.z.s.SpringBootLoggingApplication       : Running with Spring Boot v1.5.3.RELEASE, Spring v4.3.8.RELEASE
2018-07-05 15:05:13.686  INFO 15060 --- [           main] c.z.s.SpringBootLoggingApplication       : The following profiles are active: dev
2018-07-05 15:05:13.766  INFO 15060 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@79d94571: startup date [Thu Jul 05 15:05:13 GMT+08:00 2018]; root of context hierarchy
2018-07-05 15:05:14.223  INFO 15060 --- [kground-preinit] o.h.validator.internal.util.Version      : HV000001: Hibernate Validator 5.3.5.Final
2018-07-05 15:05:15.550  INFO 15060 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8081 (http)
2018-07-05 15:05:15.563  INFO 15060 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2018-07-05 15:05:15.565  INFO 15060 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.14
2018-07-05 15:05:15.703  INFO 15060 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-07-05 15:05:15.704  INFO 15060 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1938 ms
2018-07-05 15:05:15.869  INFO 15060 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-07-05 15:05:15.876  INFO 15060 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-07-05 15:05:15.877  INFO 15060 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-07-05 15:05:15.877  INFO 15060 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-07-05 15:05:15.877  INFO 15060 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-07-05 15:05:16.219  INFO 15060 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@79d94571: startup date [Thu Jul 05 15:05:13 GMT+08:00 2018]; root of context hierarchy
2018-07-05 15:05:16.298  INFO 15060 --- [           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-07-05 15:05:16.299  INFO 15060 --- [           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-07-05 15:05:16.328  INFO 15060 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-05 15:05:16.328  INFO 15060 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-05 15:05:16.369  INFO 15060 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-07-05 15:05:16.616  INFO 15060 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-07-05 15:05:16.636  INFO 15060 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Initializing ProtocolHandler ["http-nio-8081"]
2018-07-05 15:05:16.645  INFO 15060 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Starting ProtocolHandler ["http-nio-8081"]
2018-07-05 15:05:16.659  INFO 15060 --- [           main] o.a.tomcat.util.net.NioSelectorPool      : Using a shared selector for servlet write/read
2018-07-05 15:05:16.679  INFO 15060 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2018-07-05 15:05:16.685  INFO 15060 --- [           main] c.z.s.SpringBootLoggingApplication       : Started SpringBootLoggingApplication in 4.291 seconds (JVM running for 5.767)

本地日誌打印效果

圖片.png

這裏由於logback配置中將不一樣級別的日誌設置了在不一樣文件中打印,這樣很大程度上方便項目出問題查找問題。mysql

源碼地址

Spring Boot日誌組件logback實現日誌分級打印源碼git

寫在最後

歡迎關注喜歡、和點贊後續將推出更多的spring cloud教程,敬請期待。 歡迎關注個人微信公衆號獲取更多更全的學習資源,視頻資料,技術乾貨! 歡迎掃碼關注程序員

公衆號回覆「學習」,拉你進程序員技術討論羣乾貨資源第一時間分享。web

公衆號回覆「視頻」,領取800GJava視頻學習資源。 java學習全套 820G資源面試

公衆號回覆「全棧」,領取1T前端Java產品經理微信小程序Python等資源合集大放送。 全棧資料 java python 機器學習 產品經理 接近1T資源

公衆號回覆「慕課」,領取1T慕課實戰學習資源。 慕課實戰大全 php python 測試 後端 前端 前端 微信 1061G資源

公衆號回覆「實戰」,領取750G項目實戰學習資源。 先後端實戰項目 750實戰資源

公衆號回覆「面試」,領取8G面試實戰學習資源。 JAVA面試實戰視頻 傳智面試講解 8G面試資源

相關文章
相關標籤/搜索