目錄
一. 打印日志的常見三種方法?
1.1?手動創建 Logger 對象(基于SLF4J API)
1.2?使用 Lombok 插件的 @Slf4j 注解
1.3?使用 Spring 的 Log?接口(使用頻率較低)
二. 常見的 Logger,logger,log是有什么關系嗎?
三. 日志的級別和推薦級別
一. 打印日志的常見三種方法?
1.1?手動創建 Logger 對象(基于SLF4J API)
第一種方法就是手動創建 logger 日志對象,直接通過?LoggerFactory 日志工廠創建即可,使用 Logger 類型來接收,這里實例對象就叫 "logger"。
SLF4J 是日志門面(Facade),它提供統一的日志接口,不直接實現日志功能。
核心類:org.slf4j.Logger
?是 SLF4J 的核心接口,通過?LoggerFactory.getLogger()
?創建實例。
打印日志也可以單個或多個參數,具體實例如下圖,
注意每個"{}"對應一個參數即可,并且參數順序要對的上。
import com.markerhub.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.time.LocalDateTime;public class MyClass {// 通過?LoggerFactory 日志工廠創建日志對象private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";logger.info("這是手動創建的 logger 對象打出的日志:打印單個參數{}", message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;logger.info("這是手動創建的 logger 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);logger.info("這是手動創建的 logger 對象打出的日志:打印對象參數{}", user1);logger.debug("debug 日志");logger.error("error 日志");}
}
運行程序,如下控制臺打印所示,可以看出 info 就是普通的日志,debug 是調試日志,error 是錯誤日志。
這里之所以有顏色區分是因為小編使用了插件,插件名稱:"Grep Console",有需要的小伙伴可以搜索看下使用教程。
1.2?使用 Lombok 插件的 @Slf4j 注解
第二種方法最簡單,直接使用 @Slf4j 注解,但需要注意IDEA中需要安裝了 Lombok 插件并且你的 spring boot 項目中引用了 lombok 依賴。
@Slf4j 是
lombok插件提供的一個注解,用于自動生成 SLF4J 的?Logger
?實例,減少樣板代碼。其底層還是通過第一種方式去新建的 logger 對象。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
如下代碼
注解在類的頭上添加 @Slf4j 注解即可,然后就可以在本類的任意位置直接顯式調用 log 對象,不需要再自行創建,非常方便。
import com.markerhub.entity.User;
import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;@Slf4j
public class MyClass {public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印單個參數{}", message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);log.info("這是 @Slf4j 注解的 log 對象打出的日志:打印對象參數{}", user1);log.debug("debug 日志");log.error("error 日志");}
}
運行程序,如下圖,和上面的 logger 對象效果是完全一樣的。?
1.3?使用 Spring 的 Log?接口(使用頻率較低)
如下代碼所示,Spring 自身提供了?Log
接口也可以創建日志對象。
import com.markerhub.entity.User;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.time.LocalDateTime;public class MyClass {private static final Log logger = LogFactory.getLog(MyClass.class);public static void main(String[] args) {// 用法一:單個參數 logger 日志打印String message = "abcde";logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印單個參數{}",message);// 用法二:多個參數 logger 日志打印int number = 100;String message2 = "abcdefg";long time = 1000000000000000000L;logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印多個參數{},{},{}", number, message2, time);// 用法三:對象參數 logger 日志打印User user1 = new User();user1.setUsername("zhangsna");user1.setPassword("123456");user1.setCreated(LocalDateTime.now());user1.setEmail("123456@qq.com");user1.setStatus(1);logger.info("這是 @Slf4j 注解的 log 對象打出的日志:打印對象參數{}", user1);logger.debug("debug 日志");logger.error("error 日志");}
}
但是, Spring 提供的 logger 對象,無法像前兩種一樣輸出參數值,這一點其實是不太友好的,不過 Spring 提供的這種日志輸出方式基本也沒人使用,同學們作為了解即可,主要還是前兩種用的比較多。
二. 常見的 Logger,logger,log是有什么關系嗎?
(1)Logger 是SLF4J提供的日志接口,用于創建日志對象(如?LoggerFactory.getLogger()
)。需要手動實例化。
(2)log 是通過?@Slf4j?
注解生成的變量名,本質還是一個?Logger?
實例。
(3)logger ,沒有特殊含義,只是采用SLF4J提供的日志接口創建對象時,常常見對象命名為 logger 而已。
三. 日志的級別和推薦級別
如以下表格所示,日志的詳細程度由高到低。一般情況下,日志輸出的詳細,越耗費系統性能,所以不建議將日志輸出特別詳細,適中即可,大部分都是選擇 INFO 級別,也推薦大家盡量選擇 INFO 或 DEBUG 。
級別 | 嚴重性 | 適用場景 | 生產環境建議 | 開發環境建議 |
---|---|---|---|---|
TRACE | 最低 | 詳細追蹤程序執行流程 | 關閉 | 按需開啟 |
DEBUG | 低 | 調試代碼邏輯和變量狀態 | 關閉 | 開啟 |
INFO | 中 | 監控應用運行狀態和關鍵操作 | 開啟 | 開啟 |
WARN | 較高 | 潛在問題,不影響程序運行 | 開啟 | 開啟 |
ERROR | 高 | 功能錯誤,需人工干預 | 開啟 | 開啟 |
FATAL | 最高 | 致命錯誤,程序無法繼續運行 | 開啟 | 開啟 |
日志級別的設置,基本在配置文件中設置的,方式如下?
# 設置全局日志級別
logging.level.root=info# 設置特定包的日志級別
logging.level.com.example.myapp=debug# 自定義日志輸出格式和文件路徑
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
logging.file.name=app.log