1. 程式人生 > >2.SpringBoot入門教程之整合slf4j日誌配置

2.SpringBoot入門教程之整合slf4j日誌配置

SpringBoot入門教程之整合slf4j日誌配置

Java日誌框架眾多,常用的有java.util.logging, log4j, logback,commons-logging等等。個人比較偏好的是slf4j,同時也比較偏好使用字尾為.properties作為日誌的配置檔案,可能是因為比較熟悉這個吧,下面就來分享一下SpringBoot中整合日誌的經驗。日誌記錄器(Logger)是日誌處理的核心元件,日誌常用的有五個級別,有低到高依次為debug(除錯 ),info(訊息),warn(警告),error(錯誤),fatal(嚴重錯誤)。通常可以根據實際所需要的顆粒度的大小選擇其中的幾個。我們公司當前用的就是debug,info,warn,error4個級別。廢話不多說,開始操作。

目錄

開發工具以及版本

idea+jdk1.8

建立一個maven專案

這裡我就不多說了,按照步驟來吧!!!
步驟1:
這裡寫圖片描述
步驟2:
這裡寫圖片描述
步驟3:
這裡寫圖片描述
步驟4:
這裡寫圖片描述
步驟5:
這裡寫圖片描述

自此,一個maven專案建立完畢

配置pom.xml

<?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> <groupId>spring-boot</groupId> <artifactId>spring-boot01</artifactId> <version>1.0-SNAPSHOT</version> <!--父依賴--> <parent>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> </parent> <!--指定編碼格式和JDK的版本,不指定預設是JDK1.6--> <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> <!-- 新增spring-boot-starter-web依賴--> <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> <!-- 在建立Spring Boot工程時,我們引入了spring-boot-starter,其中包含了spring-boot-starter-logging, 該依賴內容就是Spring Boot預設的日誌框架Logback,所以我們在引入log4j之前,需要先排除該包的依賴, 再引入log4j的依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--引入日誌依賴--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <!-- 新增spring-boot-maven-plugin外掛 作用:該外掛支援多種功能,常用的有兩種,第一種是打包專案為可執行的jar包,另外 一個命令就是mvn spring-boot:run,可以直接使用tomcat(預設)啟動專案。 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

建立MyApplication啟動類

說明:
1.不要直接在java目錄下直接建立類,要新建一個package
2.類名可以隨便取,但是要遵循命名規範

package com.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by Administrator on 2018/5/20 0020.
 */
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args){
        SpringApplication.run(MyApplication.class, args);
    }
}

說明:@SpringBootApplication相當於新增@Configuration,@EnableAutoConfiguration,@ComponentScan三個註解

建立控制器TestController類

說明:
1.這個TestController類要和MyApplication類同級或者在其同級的子目錄下,否者在訪問介面時會出現404
2.如果不想讓TestController在MyApplication類同級或者在其同級的子目錄下則需要另行指定

package com.controller;

import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Administrator on 2018/5/20 0020.
 */
@RestController
@RequestMapping("/hello")
public class TestController {
    private Logger logger = Logger.getLogger(TestController.class);

    @RequestMapping("/hello")
    public @ResponseBody String HelloWorld(){
        for(int i=0;i<1000;i++){
            logger.debug("debug"+i);
            logger.info("info"+i);
            logger.warn("warn"+i);
            logger.error("error"+i);
            logger.fatal("fatal"+i);
        }
        return "Hello World!";
    }

}

建立log4j.properties檔案

在resources目錄下建立log4j.properties檔案並新增配置

###配置日誌根Logger
log4j.rootLogger=DEBUG,stdout,file
#ERROR 為嚴重錯誤 主要是程式的錯誤
#WARN 為一般警告,比如session丟失
#INFO 為一般要顯示的資訊,比如登入登出
#DEBUG 為程式的除錯資訊
log4j.additivity.org.apache=true

###配置日誌資訊輸出目的地Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#org.apache.log4j.ConsoleAppender(控制檯)
#org.apache.log4j.FileAppender(檔案)
#org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案)
#org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案)
#org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
#log4j.appender.error.Target=System.out
###輸出ERROR級別以上的日誌
log4j.appender.stdout.threshold=INFO
###配置日誌資訊的格式(佈局)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
#org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)
#org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串)
#org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
###配置日誌列印的格式格式化日誌資訊
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

#%m   輸出程式碼中指定的訊息
#%p   輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
#%r   輸出自應用啟動到輸出該log資訊耗費的毫秒數
#%c   輸出所屬的類目,通常就是所在類的全名
#%t   輸出產生該日誌事件的執行緒名
#%n   輸出一個回車換行符,Windows平臺為“\r\n”,Unix平臺為“\n”
#%d   輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS}
#%l   輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數
#log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
# '.'yyyy-MM:每月
# '.'yyyy-ww:每週
# '.'yyyy-MM-dd:每天
# '.'yyyy-MM-dd-a:每天兩次
# '.'yyyy-MM-dd-HH:每小時
# '.'yyyy-MM-dd-HH-mm:每分鐘
#log4j.appender.file.MaxFileSize=1MB
###滾動檔案的最大數
#log4j.appender.file.MaxBackupIndex=8
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
log4j.appender.file.Threshold=DEBUG
###將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容
log4j.appender.file.append=true
###日誌的儲存位置
#log4j.appender.file.File=E:/logs/file-debug-log.log
log4j.appender.file.File=E:/logs/debug-debug.log
###每天產生一個日誌檔案
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.maxFileSize=100
#log4j.appender.file.maxBackupIndex=5
#log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
#log4j.appender.file.Threshold=DEBUG
#log4j.appender.file.append=true
#log4j.appender.file.File=E:/logs/debug-log.log

修改Tomcat容器的啟動埠

在resources目錄下建立application.properties檔案,並新增埠配置server.port=9999,這個埠可以根據你的需要寫
說明:
1.通常resources目錄作為SpringBoot的預設的配置目錄,如果不是這個目錄則需要指定
2.通常SpringBoot使用的是內建的Tomcat容器,預設的埠是8080,也可以直接使用預設的配置

啟動測試

1.啟動專案:在MyApplication.java類中執行mian方法
這裡寫圖片描述
2.檢查日誌

"C:\Program Files\Java\jdk1.8.0_131\bin\java" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\lib\idea_rt.jar=53932:C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;E:\workspace\SpringBoot01\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.5.13.RELEASE\spring-boot-starter-web-1.5.13.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.13.RELEASE\spring-boot-starter-tomcat-1.5.13.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.31\tomcat-embed-core-8.5.31.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\tomcat-annotations-api\8.5.31\tomcat-annotations-api-8.5.31.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.31\tomcat-embed-el-8.5.31.jar;C:\Users\Administrator\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.31\tomcat-embed-websocket-8.5.31.jar;C:\Users\Administrator\.m2\repository\org\hibernate\hibernate-validator\5.3.6.Final\hibernate-validator-5.3.6.Final.jar;C:\Users\Administrator\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\Administrator\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.11.1\jackson-databind-2.8.11.1.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\Administrator\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.11\jackson-core-2.8.11.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-web\4.3.17.RELEASE\spring-web-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\4.3.17.RELEASE\spring-aop-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\4.3.17.RELEASE\spring-beans-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\4.3.17.RELEASE\spring-context-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-webmvc\4.3.17.RELEASE\spring-webmvc-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\4.3.17.RELEASE\spring-expression-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\4.3.17.RELEASE\spring-core-4.3.17.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.13.RELEASE\spring-boot-starter-1.5.13.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\1.5.13.RELEASE\spring-boot-1.5.13.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.13.RELEASE\spring-boot-autoconfigure-1.5.13.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-api\1.7.21\slf4j-api-1.7.21.jar;C:\Users\Administrator\.m2\repository\org\slf4j\slf4j-log4j12\1.7.21\slf4j-log4j12-1.7.21.jar;C:\Users\Administrator\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\Administrator\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar" com.controller.MyApplication

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

2018-05-22 00:49:14 INFO  MyApplication:48 - Starting MyApplication on PC-20180507AMKP with PID 4764 (E:\workspace\SpringBoot01\target\classes started by Administrator in E:\workspace\SpringBoot01)
2018-05-22 00:49:14 INFO  MyApplication:593 - No active profile set, falling back to default profiles: default
2018-05-22 00:49:14 INFO  AnnotationConfigEmbeddedWebApplicationContext:583 - Refreshing org.springframework.boot[email protected]67205a84: startup date [Tue May 22 00:49:14 CST 2018]; root of context hierarchy
2018-05-22 00:49:15 INFO  Version:30 - HV000001: Hibernate Validator 5.3.6.Final
2018-05-22 00:49:15 INFO  TomcatEmbeddedServletContainer:92 - Tomcat initialized with port(s): 9999 (http)
五月 22, 2018 12:49:15 上午 org.apache.catalina.core.StandardService startInternal
資訊: Starting service [Tomcat]
五月 22, 2018 12:49:15 上午 org.apache.catalina.core.StandardEngine startInternal
資訊: Starting Servlet Engine: Apache Tomcat/8.5.31
五月 22, 2018 12:49:15 上午 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Spring embedded WebApplicationContext
2018-05-22 00:49:15 INFO  ContextLoader:276 - Root WebApplicationContext: initialization completed in 984 ms
2018-05-22 00:49:16 INFO  ServletRegistrationBean:190 - Mapping servlet: 'dispatcherServlet' to [/]
2018-05-22 00:49:16 INFO  FilterRegistrationBean:258 - Mapping filter: 'characterEncodingFilter' to: [/*]
2018-05-22 00:49:16 INFO  FilterRegistrationBean:258 - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-05-22 00:49:16 INFO  FilterRegistrationBean:258 - Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-05-22 00:49:16 INFO  FilterRegistrationBean:258 - Mapping filter: 'requestContextFilter' to: [/*]
2018-05-22 00:49:16 INFO  RequestMappingHandlerAdapter:534 - Looking for @ControllerAdvice: org.springframework.boot[email protected]67205a84: startup date [Tue May 22 00:49:14 CST 2018]; root of context hierarchy
2018-05-22 00:49:16 INFO  RequestMappingHandlerMapping:543 - Mapped "{[/hello/hello]}" onto public java.lang.String com.controller.TestController.HelloWorld()
2018-05-22 00:49:16 INFO  RequestMappingHandlerMapping:543 - 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-05-22 00:49:16 INFO  RequestMappingHandlerMapping:543 - 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-05-22 00:49:16 INFO  SimpleUrlHandlerMapping:362 - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-22 00:49:16 INFO  SimpleUrlHandlerMapping:362 - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-22 00:49:16 INFO  SimpleUrlHandlerMapping:362 - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-22 00:49:16 INFO  AnnotationMBeanExporter:431 - Registering beans for JMX exposure on startup
2018-05-22 00:49:16 INFO  TomcatEmbeddedServletContainer:216 - Tomcat started on port(s): 9999 (http)
2018-05-22 00:49:16 INFO  MyApplication:57 - Started MyApplication in 1.598 seconds (JVM running for 1.885)
2018-05-22 00:51:43 INFO  DispatcherServlet:489 - FrameworkServlet 'dispatcherServlet': initialization started
五月 22, 2018 12:51:43 上午 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-05-22 00:51:43 INFO  DispatcherServlet:508 - FrameworkServlet 'dispatcherServlet': initialization completed in 9 ms
2018-05-22 00:51:43 INFO  TestController:23 - info0
2018-05-22 00:51:43 WARN  TestController:24 - warn0
2018-05-22 00:51:43 ERROR TestController:25 - error0
2018-05-22 00:51:43 FATAL TestController:26 - fatal0
2018-05-22 00:51:43 INFO  TestController:23 - info1
2018-05-22 00:51:43 WARN  TestController:24 - warn1
2018-05-22 00:51:43 ERROR TestController:25 - error1
2018-05-22 00:51:43 FATAL TestController:26 - fatal1

說明:控制檯中的日誌會記錄一些配置,如果有問題可以看分析一下日誌
(1).v1.5.13.RELEASE》》》 體現的是SpringBoot的版本
(2).Mapped “{[/hello/hello]}” onto public java.lang.String com.controller.TestController.HelloWorld()》》》體現的是介面的對映關係
(3).Tomcat started on port(s): 9999 (http)》》》體現的是內建Tomcat的啟動埠
3.通過瀏覽器訪問介面
http://localhost:9999/hello/hello
這裡寫圖片描述
4.檢視資料夾中的日誌
這裡寫圖片描述

以上是SpringBoot中引入slf4j日誌管理工具的Demo,其實即使不引入slf4j基本配置內容SpringBoot也有自帶的日誌管理日誌工具(logback),包括預設的基本配置內容,這個下次在說吧。因作者水平有限,難免會有疏忽和錯誤,讀者可以參考一些官方文件,如下:
Slf4j官網
Log4j官網
SpingBoot官方指南
SpringBoot官網