20200119 日誌框架

日誌體系與SringBoot的日誌應用

開發的時候,日誌記錄方法的調用,不應該來直接調用日誌的實現類,而是調用日誌抽象層裏面的方法;

日誌抽象層----->日誌實現層。調用日誌抽象層裏面的方法。

把不同的日誌系統的實現進行了具體的抽象化,只提供了統一的日誌使用接口。

使用時只需要按照其提供的接口方法進行調用即可,由於它只是一個接口,並不是一個具體的可以直接單獨使用的日誌框架,所以最終日誌的格式、記錄級別、輸出方式等都要通過接口綁定的具體的日誌系統來實現,這些具體的日誌系統就有log4j,logback,java.util.logging等,它們才實現了具體的日誌系統的功能。

日誌門面+日誌實現,配置文件是指日誌實現框架的配置。

api----->轉換器----->日誌具體實現。

使用slf4j以後,配置文件還是做成日誌實現框架自己本身的配置文件。

SpringBoot使用的默認日誌框架是Logback,並用INFO級別輸出到控制檯。

 

日誌模塊

slf4j中的Logger使用佔位符{}來傳入參數記錄日誌信息。使用佔位符{}方式比下面的字符串連接更加高效。

logger.info("22222:{}","test");

如果有多個佔位符,就要傳遞對象數組進去。

 

slf4j日誌配置文件,輸出tomcat格式

API日誌統一收集:類似於一個aspect切面,記錄接口的進入和出去時的相關日誌

 

兩個設置

1)指定日誌文件的輸出位置;

2)指定日誌配置文件的位置;

#logback settings
logging.level.ROOT=INFO
logging.path=c:/tomcat-log/${spring.application.name}
#logback setting
logging.level.ROOT=INFO
logging.path=/opt/tomcat-log/${spring.application.name}

日誌級別:ALL <DEBUG <INFO <WARN <ERROR,如果設置打印級別爲WARN ,那麼前面級別的日誌將不會打印。

配置文件:日誌級別、日誌處理器,用哪個處理器處理當前級別的日誌?

日誌是分級別的,打印什麼級別的日誌?如何設置日誌的輸出級別?

 

日誌框架三大組件

1、日誌記錄器:日誌輸出實例Logger,通過它才能輸出日誌

2、日誌處理器:日誌輸出目標,控制檯、文件等,可以在多個輸出文件上記錄相同的信息。

3、日誌輸出格式:時間戳、線程名稱、日誌級別、日誌內容、對應輸出該日誌的類、對應輸出該日誌的方法、行號及MDC信息等。PatternLayout:可以靈活地指定佈局模式。控制日誌的輸出格式

 

日誌處理器:要將日誌信息寫入文件,您必須使用FileAppender。

使用日誌框架,第一步就是獲取日誌記錄器,這個記錄器將負責控制日誌信息的輸出。

傳入一個class對象,表示記錄當前類的日誌

日誌框架使用:日誌的代理,統一使用它的配置文件。

 

slf4j只是一個日誌標準,並不是日誌系統的具體實現。

1、提供日誌接口;

2、提供獲取日誌對象的方法;

 

log日誌

1、工廠類

2、log中的方法info()或者error()日誌工具在項目中的使用,日誌類中有哪些方法?方法是根據級別定義的。

3、在日誌中打印當前時間,SimpleDateFormat,format(new Date())

4、log中是否已經有了要包含的時間 或者說發生故障的時間,這個要在log配置文件中查詢?

5、info,error裏面所有的錯誤日誌都有記錄。

6、服務器端日誌文件的記錄位置,配置文件中有。

 

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

引入了logback日誌框架;

 

mvn dependency:tree

查看依賴之間的傳遞關係, log日誌有哪個jar包引入的?

 

日誌框架怎麼使用,怎麼配置?

log4j.rootLogger 是配置文件的根節點,這個指定了你的日誌要以什麼級別,輸出到哪裏去,例子中級別是:info,輸出到console,logfile去。

log4j.appender 配置輸出日誌添加到哪去,這個就需要配合上面的console,logfile這個

 

ConsoleAppender

指定了輸出到console日誌,是輸出到控制檯的日誌,這個就保證了你在代碼中輸入的log.info()的內容能在控制檯看見了,沒有這個,你log.info的內容就不可能出現控制檯上

 

FileAppender

輸出到logfile的日誌,是添加到文件中去。這個就是平常我們在日誌文件中查看日誌,就是因爲這個,才能讓日誌輸出到我們指定的文件。

指定日誌所在的目錄以及日誌文件名:日誌的目錄以及日誌文件名。

 

控制檯日誌:根據日誌級別用顏色區分,這個特別好。

控制檯Console日誌數據查詢快捷鍵 Ctrl+K,可以查看某指定類的日誌。如何對日誌進行過濾?

 

1)每天產生一個日誌文件,

2)文件大小到達指定尺寸的時候產生一個新的文件。

 

日誌框架的使用:把日誌框架封裝成一個jar包,配置文件封裝到jar包裏面使用,所以看不到配置文件

 

寫入位於日誌目錄中名爲“log.out”的文件

日誌文件的記錄位置;

logging.config=classpath:log4j2-dev.xml 這個地址是在哪裏啊?

 

如何讓系統中所有的日誌都統一到slf4j?

1、將系統中其他日誌框架先排除出去;

2、用中間包來替換原有的日誌框架;

3、我們導入slf4j其他的實現;

 

SpringBoot日誌使用

SpringBoot選用 SLF4j和logback

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-logging</artifactId>

</dependency>

總結

  1. 、SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
  2. 、SpringBoot也把其他的日誌都替換成了slf4j;
  3. 、中間替換包(轉換包)

logback.xml:配置文件能夠被日誌框架直接識別

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
    <property name="encoder.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{req.xForwardedFor} %X{req.method} %X{req.requestURL} %X{req.queryString} %X{req.userAgent} %-5level %logger{36} - %msg%n"/>
    <property name="rollingPolicy.maxFileSize" value="5MB"/>
    <property name="rollingPolicy.maxHistory" value="30"/>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <encoder>
            <pattern>${encoder.pattern}</pattern>
        </encoder>
    </appender>
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${encoder.pattern}</pattern>
            <charset>GBK</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/trace.%i.log</fileNamePattern>
            <maxHistory>${rollingPolicy.maxHistory}</maxHistory>
            <maxFileSize>${rollingPolicy.maxFileSize}</maxFileSize>
        </rollingPolicy>
    </appender>
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${encoder.pattern}</pattern>
            <charset>GBK</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info.%i.log</fileNamePattern>
            <maxHistory>${rollingPolicy.maxHistory}</maxHistory>
            <maxFileSize>${rollingPolicy.maxFileSize}</maxFileSize>
        </rollingPolicy>
    </appender>
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${encoder.pattern}</pattern>
            <charset>GBK</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/debug.%i.log</fileNamePattern>
            <maxHistory>${rollingPolicy.maxHistory}</maxHistory>
            <maxFileSize>${rollingPolicy.maxFileSize}</maxFileSize>
        </rollingPolicy>
    </appender>
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${encoder.pattern}</pattern>
            <charset>GBK</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/warn.%i.log</fileNamePattern>
            <maxHistory>${rollingPolicy.maxHistory}</maxHistory>
            <maxFileSize>${rollingPolicy.maxFileSize}</maxFileSize>
        </rollingPolicy>
    </appender>
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${encoder.pattern}</pattern>
            <charset>GBK</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/error.%i.log</fileNamePattern>
            <maxHistory>${rollingPolicy.maxHistory}</maxHistory>
            <maxFileSize>${rollingPolicy.maxFileSize}</maxFileSize>
        </rollingPolicy>
    </appender>
    <!--logger-->
    <logger name="com.ibatis" level="DEBUG" />
    <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG" />
    <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG" />
    <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG" />
    <logger name="java.sql.Connection" level="DEBUG" />
    <logger name="java.sql.Statement" level="DEBUG" />
    <logger name="java.sql.PreparedStatement" level="DEBUG" />
    <!--root-->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO" />
        <appender-ref ref="ERROR" />
    </root>
</configuration>

 

一般情況下,框架本身使用的是slf4j日誌,或者說日誌門面框架。

使用日誌框架的目的是幫助我們快速定位問題。

使用日誌框架,我們可以控制日誌信息的輸出,我們可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。日誌配置文件。

# 配置根Logger
log4j.rootLogger = debug,stdout,D,E

# 1.配置日誌信息輸出的目的地(還可以輸出到文件,並且設置日誌文件的大小) Appender 負責控制日誌記錄操作的輸出。
# 輸出日誌信息到控制檯
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out

# 2.配置日誌信息的格式佈局(佈局類型可以選擇)
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

# 輸出DEBUG級別以上的日誌到文件F://logs/debug.log
log4j.appender.D = org.apache.log4j.FileAppender
log4j.appender.D.File = F:/logs/debug.log
# true表示將日誌信息追加到指定文件中,false表示覆蓋指定文件中的內容
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
# 指定佈局格式
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

 

 

 

 

發佈了303 篇原創文章 · 獲贊 104 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章