前面介绍了Spring Boot 异常处理,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。
今天主要讲解Spring Boot中的日志收集,日志是追踪错误定位问题的关键,特别在生产环境中,我们需要通过日志快速定位解决问题。
Springboot的日志的框架比较丰富,而且Springboot本身就内置了日志功能,不过实际项目中会出现:只记录想要的日志,日志输出到磁盘,按天归档,日志信息同步到其他系统等功能。这些是Springboot本身就内置了日志功能不具备的。所以我推荐使用logback。下面我们就以logback讲讲Spring Boot中的日志收集。
为什么要统一日志
前面我们说了Springboot 本身就可以日志功能,为什么还需要统一规范日志?
1、日志统一,方便查阅管理。
2、日志分割归档功能。
3、日志持久化功能。
4、方便日志系统(ELK)收集。
配置
在resource下创建logback-spring.xml文件,以下直接贴出配置信息,介绍信息可以直接参考备注
"1.0" encoding="UTF-8"?>"true" scanPeriod="10 seconds"> logback "log.path" value="D:/Documents/logs/edu" /> "clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> "wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> "wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> "CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> "CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> class="ch.qos.logback.classic.filter.ThresholdFilter"> debug ${CONSOLE_LOG_PATTERN} UTF-8 "DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> ${log.path}/edu_debug.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 100MB 15 class="ch.qos.logback.classic.filter.LevelFilter"> debug ACCEPT DENY "INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> ${log.path}/edu_info.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ${log.path}/web-info-%d{yyyy-MM-dd}.%i.log class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 100MB 15 class="ch.qos.logback.classic.filter.LevelFilter"> info ACCEPT DENY "WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> ${log.path}/edu_warn.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 100MB 15 class="ch.qos.logback.classic.filter.LevelFilter"> warn ACCEPT DENY "ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> ${log.path}/edu_error.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n UTF-8 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> ${log.path}/web-error-%d{yyyy-MM-dd}.%i.log class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 100MB 15 class="ch.qos.logback.classic.filter.LevelFilter"> ERROR ACCEPT DENY "dev"> "com.cms" level="info"/> "info"> ref ref="CONSOLE" /> ref ref="DEBUG_FILE" /> ref ref="INFO_FILE" /> ref ref="WARN_FILE" /> ref ref="ERROR_FILE" /> "pro"> "com.cms" level="warn"/> "info"> ref ref="ERROR_FILE" /> ref ref="WARN_FILE" />
注意
-
日志的环境即spring.profiles.acticve,跟随项目启动。
-
启动后,即可到自定目录查找到生成的日志文件。
- 官方推荐使用的xml名字的格式为:logback-spring.xml而不是logback.xml。
配置application.properties
在application.properties配置logback
############################################################ # # logback 配置,日志管理 # ############################################################ #日志配置,输出到文本, logging.config=classpath:logback-spring.xml #idea控制台默认日志级别修改 # 指定输出日志的文件名,默认输出至当前项目目录下 #logging.file.path=springboot.log
收集异常日志
上一篇文章已经讲过统一异常处理,请看这篇文章《SpringBoot入门系列(十一)统一异常处理的实现》。修改统一异常处理器GlobalExceptionHandler类,将异常方法中的直接打印改为日志输入并打印:
@ExceptionHandler(value = Exception.class) public Object errorHandler(HttpServletRequest reqest, HttpServletResponse response, Exception e) throws Exception { //e.printStackTrace(); // 记录日志 logger.error(ExceptionUtils.getMessage(e)); // 是否ajax请求 if (isAjax(reqest)) { return JSONResult.errorException(e.getMessage()); } else { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.addObject("url", reqest.getRequestURL()); mav.setViewName(ERROR_VIEW); return mav; } }
程序中记录日志
在com.weiz.controller 中创建LoggingController 控制器
package com.weiz.controller; import com.weiz.utils.JSONResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/log") public class LoggingController { Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping("/write") public JSONResult writeLog(){ // 级别由低到高 tracelogger.trace("这是一个trace日志"); logger.debug("这是一个debug日志"); logger.info("这是一个info日志"); logger.warn("这是一个warn日志"); logger.error("这是一个error日志"); return JSONResult.ok("write log success"); } }
测试
启动项目,在浏览器输入:http://localhost:8080/log/write ,去相关目录下查看日志文件
异常日志:
最后
以上,就把Spring Boot集成logback进行统一日志收集介绍完了。还是比较简单的,还有其他实际应用场景中的相关需求如:日志压缩,同步kafka等,大家自己去研究吧。
这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号(架构师精进),回复:springboot源码。获取这个系列课程的完整源码。