SpringCloud统⼀异常及⽇志处理(⼀)
SpringCloud统⼀异常及⽇志处理(⼀)
前⾔
  Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,简单来说,⼀个SpringCloud包含了N个SpringBoot。在各项服务之间相互分离为不同的jar包的时候,各服务内部异常和⽇志的统⼀处理将会显得尤为重要和困难,在这⾥笔者将利⽤⾃⼰的实际项⽬举例,记录当前项⽬中是如何进⾏以上所述操作的。  笔者在阅读较多类似⽂章后,总结出⼀套较为适合本项⽬的处理机制,各位看官酌情参考。如果各位有更好的解决思路,还请不吝赐教。
⼀、异常处理
由于我在系统中单独做了数据接⼝,所以以下将会由该服务举例,其他服务类似。
1. 将每个服务中涉及到的所有的状态码单独划分为⼀个枚举体,BaseStatus。
public enum BaseStatus {
SYSTEM_ERROR(5100,"系统错误"),
PARAM_ERROR(5101,"参数错误"),
INSERT_FAIL(5102,"新增失败"),
DELETE_FAIL(5103,"删除失败"),
UPDATE_FAIL(5104,"更新失败"),
SELECT_FAIL(5105,"查询失败")
;
private final Integer status;
private final String message;
public Integer getStatus(){
return this.status;
}
public String getMessage(){
ssage;
}
BaseStatus(Integer status, String message){
this.status = status;
}
}
2. 对服务进⾏异常分类,这⾥我只展⽰基类,其他异常类extends BaseException
public class BaseException extends RuntimeException{
private static final long serialVersionUID =-3872700496475775551L;
private final BaseStatus baseStatus;
private final String extMsg;
public BaseException(BaseStatus baseStatus, String extMsg){
Message()+(extMsg == null ?"":('@'+ extMsg)));
this.baseStatus = baseStatus;
}
public BaseStatus getBaseStatus(){
return this.baseStatus;
}
public String getExtMsg(){
return extMsg;
}
}
3. 单独建⽴⼀个异常的处理类,针对不同的异常进⾏不同的处理。这⾥要添加@RestControllerAdvice的注解,所有控制器中的抛出异
常将会由该类进⾏处理。 @ExceptionHandler注解将会⽤来选择哪些异常进⼊到哪些⽅法中,这⾥进⾏简单举例。
@ResponseBody
@RestControllerAdvice
public class ExceptionsHandler {
@ExceptionHandler({UserException.class})
public<T extends BaseException> ResponseEntity<JSONObject>warnException(T exception){
log.warn(exception);
return new ResponseEntity<JSONObject>(HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler({Exception.class, Error.class})
public<T extends Throwable> ResponseEntity<JSONObject>errorException(T exception){
<(exception);
return new ResponseEntity<JSONObject>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
⼆、⽇志处理
1.引⼊依赖
maven依赖如下,这⾥使⽤了log4j2,使⽤log4j2时需要在其他依赖中排除:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.4.1</version>
spring系列框架有哪些
</dependency>
2.配置log4j2
log4j2的具体配置请参考官⽅⽂档,这⾥需要重点提的是,我的⽇志选择了异步处理的⽅式,当系统抛出异常后,⾸先将会交由log4j2进⾏收集,然后将会将异常信息通过Socket发送到logstash,进⾏第⼆步的收集、解析、转换,之后将会通过管道发送到Elasticsearch,以达到⽇志的统⼀处理的⽬的。ELK stack将会在下⼀章进⾏详细说明,这⾥暂时先不赘述了:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-30.30C{1.} : %m%n</property>
</Properties>
<Appenders>
<Console name="Console"target="SYSTEM_OUT"follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<Socket name="logstash-tcp"host="x"port="8501"protocol="TCP">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Socket>
</Appenders>
<Loggers>
<!-- 如果使⽤<asyncRoot> 或 <asyncLogger>,includeLocation="true"是必须要设置才会有类路径等⼀些信息打印出来 -->
<AsyncLogger name="com.MultiTec.HikAc.OracleService"level="warn"includeLocation="true">
<appender-ref ref="logstash-tcp"/>
</AsyncLogger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
总结
以上就是今天要分享的内容,好的系统⼀定是多种优秀的⼯具相互搭配,互相成就,发挥出最好的效果来,作为程序员,不仅要对代码有⾜够⾼的敏感性,更要对不同的实现⽅式、⼯具的组合使⽤永远抱有充分的好奇⼼,如果您喜欢我的⽂章,请点赞收藏,如果您有更好的实现思路,请不吝赐教。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。