日誌體系與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>
總結
- 、SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
- 、SpringBoot也把其他的日誌都替換成了slf4j;
- 、中間替換包(轉換包)
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