1. SLF4J簡介
SLF4J(Simple Logging Facade for Java)是一種日志規(guī)范,類似于JDBC,我們常用的日志log4j、logback等都實(shí)現(xiàn)了這個(gè)規(guī)范,所以我們可以直接使用SLF4J的規(guī)范來使用日志。
2. logback和log4j
它們是同一個(gè)作者開發(fā)的,logback是重新編寫的內(nèi)核,在一些關(guān)鍵執(zhí)行的路徑上提升了10倍以上。它也支持了一些新的特性。
這兩者雖然作者相同,但log4j早已被托管給Apache基金會維護(hù),并且自從2012年5月之后就沒有更新了。而logback從出生開始就是其作者奔著取代log4j的目的開發(fā)的,因此一方面logback繼承了log4j大量的用法,使得學(xué)習(xí)和遷移的成本不高,另一方面logback在性能上要明顯優(yōu)于log4j,尤其是在大量并發(fā)的環(huán)境下,并且新增了一些log4j所沒有的功能(如將日志文件壓縮成zip包等)
思考一下
為什么要記錄日志?
-
程序上線前:代碼編寫過程
-
測試環(huán)節(jié)更快的找bug
-
易于觀察程序的執(zhí)行順序和執(zhí)行流程
-
-
程序上線之后:
-
用來跟蹤定位程序的運(yùn)行狀態(tài)
-
用來快速的定位bug
-
3. logback的使用
3.1 引入依賴
logback是遵循slf4j規(guī)范的,所以要先引入其依賴.其實(shí)logback內(nèi)部已經(jīng)關(guān)聯(lián)了slf4j的jar包,其實(shí)只需要依賴logback的依賴!
導(dǎo)入坐標(biāo):
<!--加入slf4j+logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<!--SLF4J轉(zhuǎn)化包 可以打印spring框架的日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
如上所示是集成所需要的依賴,其中:
-
第一個(gè)logback-classic包含了logback本身所需的slf4j-api.jar、logback-core.jar及l(fā)ogback-classsic.jar。
-
第二個(gè)logback-ext-spring是由官方提供的對Spring的支持,它的作用就相當(dāng)于log4j中Log4jConfigListener;這個(gè)listener,網(wǎng)上大多都是用的自己實(shí)現(xiàn)的,原因在于這個(gè)插件似乎并沒有出現(xiàn)在官方文檔的顯要位置導(dǎo)致大多數(shù)人并不知道它的存在。
-
第三個(gè)jcl-over-slf4j是用來把Spring源代碼中大量使用到的commons-logging替換成slf4j,只有在添加了這個(gè)依賴之后才能看到Spring框架本身打印的日志–即info文件中打印出的spring啟動日志信息,否則只能看到開發(fā)者自己打印的日志。
3.2 引入logback.xml日志配置文件
這里特別注意引入位置(maven工程)在src/main/resource這個(gè)根目錄下。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日志文件的存儲地址 logs為當(dāng)前項(xiàng)目的logs目錄 還可以設(shè)置為../logs -->
<property name="LOG_HOME" value="logs" />
<!--控制臺日志, 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個(gè)字符寬度,%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %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_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志輸出級別 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
<!-- 指定項(xiàng)目中某個(gè)包,當(dāng)有日志操作行為時(shí)的日志記錄級別 -->
<!-- com.framework為根包,也就是只要是發(fā)生在這個(gè)根包下面的所有日志操作行為的權(quán)限都是DEBUG -->
<!-- 級別依次為【從高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<!--
<logger name="com.framework" level="info">
<appender-ref ref="demolog" />
</logger>
-->
</configuration>
4. logback.xml日志配置文件的配置邏輯:
1.先對日志的基本配置聲明:包括日志的輸出路徑— (日志路徑,這里是相對路徑,web項(xiàng)目idea下會輸出到idea 的安裝目錄下,如果部署到linux上的tomcat下,會輸出到tomcat/bin目錄 下 ) ,日志級別—(日志的輸出級別 由低到高(越高問題越嚴(yán)重)trace->debug->info->warn->error ),日志生成的文件名,日志文件大小等。
2.聲明不同appender來具體定義系統(tǒng)不同級別的信息匹配記錄,和生成文件的設(shè)置,只是定義,并沒有引入本應(yīng) 用就不會用到。
3.為某些特定的包加上上面定義好的appender。用來區(qū)別對待系統(tǒng)一般的日志輸出模式。
4.將定義好的appender添加到本應(yīng)用的日志系統(tǒng)中。類是定時(shí)任務(wù)中先聲明任務(wù),在把任務(wù)加入到調(diào)度里才算這個(gè)任務(wù)開始被使用了。
5. 理解正確的日志輸出級別
很多人都忽略了日志輸出級別, 甚至不知道如何指定日志的輸出級別. 相對于System.out來說, 日志框架有兩個(gè)最大的優(yōu)點(diǎn)就是可以指定輸出類別(category)和級別(level). 對于日志輸出級別來說, 下面是我們應(yīng)該記住的一些原則:
ERROR:
系統(tǒng)發(fā)生了嚴(yán)重的錯(cuò)誤, 必須馬上進(jìn)行處理, 否則系統(tǒng)將無法繼續(xù)運(yùn)行. 比如, NPE, 數(shù)據(jù)庫不可用等.
WARN:
系統(tǒng)能繼續(xù)運(yùn)行, 但是必須引起關(guān)注. 對于存在的問題一般可以分為兩類:
-
系統(tǒng)存在明顯的問題(比如, 數(shù)據(jù)不可用),
-
就是系統(tǒng)存在潛在的問題,需要引起注意或者給出一些建議
- (比如, 系統(tǒng)運(yùn)行在安全模式或者訪問當(dāng)前系統(tǒng)的賬號存在安全隱患). 總之就是系統(tǒng)仍然可用,但是最好進(jìn)行檢查和調(diào)整.
INFO:
重要的業(yè)務(wù)邏輯處理完成. 在理想情況下, INFO的日志信息要能讓高級用戶和系統(tǒng)管理員理解, 并從日志信息中能知道系統(tǒng)當(dāng)前的運(yùn)行狀態(tài)。
比如對于一個(gè)機(jī)票預(yù)訂系統(tǒng)來說, 當(dāng)一個(gè)用戶完成一個(gè)機(jī)票預(yù)訂操作之后, 提醒應(yīng)該給出"誰預(yù)訂了從A到B的機(jī)票". 另一個(gè)需要輸出INFO信息的地方就是一個(gè)系統(tǒng)操作引起系統(tǒng)的狀態(tài)發(fā)生了重大變化(比如數(shù)據(jù)庫更新, 過多的系統(tǒng)請求).
DEBUG: 主要給開發(fā)人員看,
TRACE: 系統(tǒng)詳細(xì)信息, 主要給開發(fā)人員用, 一般來說, 如果是線上系統(tǒng)的話, 可以認(rèn)為是臨時(shí)輸出, 而且隨時(shí)可以通過開關(guān)將其關(guān)閉. 有時(shí)候我們很難將DEBUG和TRACE區(qū)分開, 一般情況下, 如果是一個(gè)已經(jīng)開發(fā)測試完成的系統(tǒng), 再往系統(tǒng)中添加日志輸出, 那么應(yīng)該設(shè)為TRACE級別.
測試應(yīng)用:
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@WebAppConfiguration
public class UserControllerTest {
@Test
public void sys(){
log.trace("trace測試{}","trace顯示");
log.debug("debug測試{}","debug顯示");
log.info("info測試{}","info顯示");
log.warn("warn測試{}","warn顯示");
log.error("error測試{}","error顯示");
}
}
6. 其他補(bǔ)充
如果需要查看mybatis的SQL信息,需要把級別改為debug。
有兩種方式:
1、把全局的日志級別設(shè)為info,然后把打印SQL相關(guān)的日志級別改為debug
<logger name="druid.sql" level="debug"/> <!--指定數(shù)據(jù)庫-->
<logger name="com.xcj.batchdemo" level="debug"/><!--指定某個(gè)包下-->
<!-- 日志輸出級別 -->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
2、將全局的日志級別設(shè)置為debug,然后將需要屏蔽的框架日志級別設(shè)置為info
<logger name="org.springframework" level="INFO" />
<logger name="org.hibernate" level="INFO" />
<logger name="org.apache.ibatis" level="INFO" />
<!-- 控制臺日志輸出級別 -->
<root level="debug">
<appender-ref ref="console"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
3、mybatis簡易常用配置直接顯示到控制臺:
<?xml version="1.0"?>
<configuration>
<!--定義日志文件的存儲地址 logs為當(dāng)前項(xiàng)目的logs目錄 還可以設(shè)置為../logs -->
<property name="LOG_HOME" value="logs" />
<!-- ch.qos.logback.core.ConsoleAppender 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志級別 -->
<root>
<level value="off" />
<appender-ref ref="STDOUT" />
</root>
<logger name="cn" level="DEBUG"/>
</configuration>
如果文件地址放的正確還是提醒xml找不到? 可選擇下面的進(jìn)行填補(bǔ)
配置全局掃描xml文章來源:http://www.zghlxwxcb.cn/news/detail-527603.html
盡量的在pom的build標(biāo)簽中加入如下內(nèi)容,以掃描到logback.xml文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-527603.html
<!--掃描全局xml-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
到了這里,關(guān)于spring整合logBack日志框架:的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!