日誌框架Slf4j和Logback的使用說明
阿新 • • 發佈:2018-12-16
1.什麼是日誌框架
- 是一套能實現日誌輸出的工具包
- 能夠描述系統執行狀態的所有時間可以算作日誌
- 使用者下線
- 介面超時
- 資料庫崩潰
2.日誌框架的能力
- 定製輸出目標
- 可以以檔案的形式儲存在固定的地方
- 日誌檔案的滾動策略,如一天一個數據檔案等
- 日誌存到資料庫等要求
- 定製輸出格式,方便後期加工和處理
- 攜帶上下文資訊
- 執行時選擇性輸出,不同情況下輸出的內容不同
- 靈活的配置
- 優異的效能
3.常見的日誌框架
日誌門面 | 日誌實現 |
---|---|
Apache :JCL | Log4j |
SLF4j | Log4j2 |
jboss-logging | Logback |
Java:JUL |
最優框架:SLF4j+Logback
4.日誌框架的使用
4.1Slf4j的使用
1.基本使用
-
首先基於SpringBoot搭建框架,然後書寫測試類
@RunWith(SpringRunner.class) @SpringBootTest public class LoggerTest { //選擇slf4j下的類,同時填寫當前類的類名,這樣打印出來的日誌也是當前類的全包名。 //當然也可以設定其他的類名,那麼就會打印出設定的類名 private final Logger logger=LoggerFactory.getLogger(LoggerTest.class); @Test public
列印後檢視控制檯資訊,日誌是當前類的全包名
2018-10-20 16:46:21.391 INFO 23112 --- [ main] com.antfin.sell.LoggerTest : --info-- 2018-10-20 16:46:21.391 ERROR 23112 --- [ main] com.antfin.sell.LoggerTest : --error--
這是因為預設的日誌級別是info,小於info級別的日誌不會列印。
可以檢視
org.slf4j.event
檢視日誌級別ERROR, WAR, INFO, DEBUG, TRACE;
2.使用lombok工具
-
改進日誌類,每次都需要寫入當前類比較麻煩,可以使用lombok外掛來簡化
- 新增依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
- 使用註釋
Slf4j
,變數名稱直接為log
@RunWith(SpringRunner.class) @SpringBootTest //lombok.extern.slf4j.Slf4j; @Slf4j public class LoggerTest2 { @Test public void test1(){ log.debug("--debug--"); log.info("--info--"); log.error("--error--"); } }
注意:如果找不到log變數,那麼新增idea需要新增外掛
Lombok Plugin
,再重啟即可。
3.日誌中打印出變數
- 使用佔位符
{}
String name="imooc";
String pass="123456";
log.info("name:{},pass:{}",name,pass);
4.2Logback的配置
- application.yml 比較簡單。只能配置路徑和輸出格式等簡單的操作。
- logback-spring.xml 比較複雜,但是相應的功能也比較強大。
4.2.1 需求出發
- 區分info和error日誌
- 每天產生一個日誌檔案
4.2.2 application.yml
logging:
pattern:
console: "%d - %msg%n"
#path: F:\logs\springboot
file: F:\logs\springboot\sell.log
level:
com: debug
具體的可以根據註釋看到:
- path和file都是指定路徑的,但是file可以指定檔名
- 對於指定級別 指定範圍可以指定類,也可以說是包名。或者直接是
root
4.2.3 logback-spring.xml
- logback-spring.xml位於resources目錄下
1.基本版
注意格式要正確,因為沒有提示要小心出錯。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--控制檯的輸出-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--範圍和級別 root整個專案都適用-->
<root level="info">
<appender-ref ref="consoleLog"/>
</root>
</configuration>
2.配置到輸出檔案,且每天產生一個日誌檔案
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--輸出檔案的配置-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滾動策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路徑-->
<fileNamePattern>F:\logs\sell\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--範圍和級別 root整個專案都適用-->
<root level="info">
<appender-ref ref="fileInfoLog"/>
</root>
</configuration>
3.區分info和error日誌
-
對於error的日誌只需要在其節點內加入
<filter></filter>
進行過濾即可,意思是隻攔截Error及以上級別的日誌,所以只想保留INFO是不可以的<!--根據範圍來過濾--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter>
-
對於info的日誌也使用標籤
<filter></filter>
,但使用另外一個類LevelFilter,點選該類可以看到有三個DENY\NEUTRAL\ACCEPT 操作。如果選擇ACCEPT,則 則使用該條規則,選擇NEUTRAL則忽略該條規則。<!--根據範圍來過濾--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!--符合級別就過濾掉--> <onMatch>DENY</onMatch> <!--符合就接受--> <onMismatch>ACCEPT</onMismatch> </filter>
-
完整的日誌配置規則
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--控制檯的輸出-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--輸出檔案的配置 INFO-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根據範圍來過濾-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--符合級別就過濾掉-->
<onMatch>DENY</onMatch>
<!--符合就接受-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滾動策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路徑-->
<fileNamePattern>F:\logs\sell\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--輸出檔案的配置-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根據範圍來過濾-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滾動策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路徑-->
<fileNamePattern>F:\logs\sell\error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--範圍和級別 root整個專案都適用-->
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>