文章目錄
- Spring日志
- 日志作用
- 日志測試
- 日志信息
- 日志級別
- 日志配置
- 配置日志級別
- 日志持久化
- 日志文件分割
- 注解的使用
Spring日志
日志作用
- 系統監控:可以通過日志記錄這個系統的運行狀態,對數據進行分析,設置不同的規則,超過閾值時進行報警。
- 數據采集:數據采集是一個比較大的范圍,采集的數據可以作用在很多方面,比如數據統計,推薦排序等。
- 日志審計:通過系統日志分析,可以判斷一些非法攻擊,非法調用,以及系統處理過程中的安全隱患。
日志測試
SpringBoot 內置了日志框架 Slf4j,可以直接在程序中調用 Slf4j 來輸出日志。
@RequestMapping("/logger")
@RestController
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/print")public String print() {logger.info("使用日志對象打印日志");System.out.println("使用sout打印日志");return "success";}
}
日志信息
日志級別
日志級別代表著日志信息對應問題的嚴重性,目的是為了更快的篩選符合目標的日志信息。
日志的級別從高到低依次為:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
1.FATAL:致命信息,表示需要立即被處理的系統級錯誤
2.ERROR:錯誤信息,級別較高的錯誤日志信息,但仍然不影響系統的繼續運行
3.WARN:警告信息,不影響使用,但需要注意的問題(以上的錯誤如果長期不處理,會引起故障)
4.INFO:普通信息,用于記錄應用程序正常運行時的一些信息
5.DEBUG:調試信息,需要調試時候的關鍵信息打印
6.TRACE:追蹤信息,比DEBUG更細粒度的信息事件(除非有特殊用意,否則請使用DEBUG級別替代)
注意:日志級別通常和測試人員的Bug級別沒有關系,日志級別是開發人員自己設置的,開發人員根據自己的理解來判斷該信息的重要程度。
@RequestMapping("/level")public String levelPrint() {logger.trace("=======trace級別日志=======");logger.debug("=======debug級別日志=======");logger.info("=======info級別日志=======");logger.warn("=======warn級別日志=======");logger.error("=======error級別日志=======");return "success";}
此時控制臺只打印info,warn和error級別的日志,不會打印出debug,trace級別的日志,這與日志級別的配置有關,日志的輸出級別默認是 info 級別,所以只會打印大于等于此級別的日志,也就是info,warn和error。
日志配置
配置日志級別
整個程序(root)日志的輸出級別設置為debug級別。
logging:level:root: debug
這樣控制臺打印出來的日志信息就包括debug級別以及debug以上級別的信息,包括info,warn,error。
日志持久化
以上的日志都是輸出在控制臺上的,然而在線上環境中,需要把日志保存下來,以便出現問題之后追 溯問題,把日志保存下來就叫持久化。日志持久化有兩種方式:
- 配置日志文件名
logging:file:name: logger/captcha.log
日志信息將存儲到文件主目錄下的logger的captcha.log文件中。
- 配置日志的存儲目錄
這種方式只能設置日志的路徑,文件名為固定的spring.log。
logging:file:name: logger
logging.file.name 和 logging.file.path 都配置的情況下,僅 logging.file.name 有用。
日志文件分割
如果日志都放在一個文件中,隨著項目的運行,日志文件會越來越大,需要對日志文件進行分割。日志框架考慮到了這一點,會自動配置。
默認日志文件超過10M就進行分割,并且設定其命名格式。
logging:logback:rollingpolicy:max-file-size: 10MBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
注解的使用
lombok提供 @Slf4j 會提供一個日志對象 log,實際工作中直接使用就可以。
@Slf4j
@RequestMapping("/logger2")
@RestController
public class LoggerController2 {@RequestMapping("/log")public String print() {log.info("使用日志對象打印日志");System.out.println("使用sout打印日志");return "success";}
}