• 开发中 — — 异常与日志处理


    开发中 — — 异常与日志处理

    在企业开发中,对异常的处理显得尤为重要,因为一旦处理不好就极有可能让用户看到不友好的界面

    1 异常处理(全局处理异常)

    - common
    	- common-util
    	- serivce-util 	
    

    在这里插入图片描述

    1.1 在common-util模块添加异常类

    /**
     * 自定义全局异常类
     *
     * @author qy
     */
    @Data
    @ApiModel(value = "自定义全局异常类")
    public class YyghException extends RuntimeException {
    
        @ApiModelProperty(value = "异常状态码")
        private Integer code;
    
        /**
         * 通过状态码和错误消息创建异常对象
         * @param message
         * @param code
         */
        public YyghException(String message, Integer code) {
            super(message);
            this.code = code;
        }
    
        /**
         * 接收枚举类型对象
         * @param resultCodeEnum
         */
        public YyghException(ResultCodeEnum resultCodeEnum) {
            super(resultCodeEnum.getMessage());
            this.code = resultCodeEnum.getCode();
        }
    
        @Override
        public String toString() {
            return "YyghException{" +
                    "code=" + code +
                    ", message=" + this.getMessage() +
                    '}';
        }
    }
    

    1.2 在service-util模块添加全局异常处理

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)//处理Exception异常
        @ResponseBody//返回值转换为json格式
        public Result error(Exception e){
            e.printStackTrace();
            return Result.fail();
        }
    
    
        @ExceptionHandler(YyghException.class)//自定义异常处理办法
        @ResponseBody
        public Result error(YyghException e){
            return Result.build(e.getCode(), e.getMessage());
        }
    }
    
    

    1.3 测试

    在controller中,手写一个异常

    在这里插入图片描述

    通过Swagger发送请求,服务端发送回来的数据【走全局异常处理】:
    在这里插入图片描述

    手动抛出自定义异常

    在这里插入图片描述

    返回结果:
    在这里插入图片描述

    2 日志处理

    在开发中,日志也是很重要的,一个良好的日志,可以让我们快速定位到问题所在

    日志记录器(Logger)的行为是分等级的。如下所示:
    分为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
    默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别

    设置日志级别
    logging.level.root=WARN
    这种方式只能将日志打印在控制台上

    2.1 logback日志

    spring boot内部使用Logback作为日志实现的框架。
    Logback和log4j非常相似,如果你对log4j很熟悉,那对logback很快就会得心应手。

    在想要使用logback日志模块的resource目录下,创建logback-spring.xml即可完成配置【文件名不变】
    在这里插入图片描述

    2.2 logback日志内容(样板)

    指定日志输出目录

    
    <configuration  scan="true" scanPeriod="10 seconds">
        
        
        
        
        <contextName>logbackcontextName>
        
        <property name="log.path" value="D:/yygh_log/edu" />
        
        
        
        
        
        
        
        <property name="CONSOLE_LOG_PATTERN"
                  value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
        
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            
            
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFOlevel>
            filter>
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
                
                <charset>UTF-8charset>
            encoder>
        appender>
        
        
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            
            <file>${log.path}/log_info.logfile>
            
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
                <charset>UTF-8charset>
            encoder>
            
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                
                <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MBmaxFileSize>
                timeBasedFileNamingAndTriggeringPolicy>
                
                <maxHistory>15maxHistory>
            rollingPolicy>
            
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFOlevel>
                <onMatch>ACCEPTonMatch>
                <onMismatch>DENYonMismatch>
            filter>
        appender>
    
        
        <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            
            <file>${log.path}/log_warn.logfile>
            
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
                <charset>UTF-8charset> 
            encoder>
            
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MBmaxFileSize>
                timeBasedFileNamingAndTriggeringPolicy>
                
                <maxHistory>15maxHistory>
            rollingPolicy>
            
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>warnlevel>
                <onMatch>ACCEPTonMatch>
                <onMismatch>DENYonMismatch>
            filter>
        appender>
    
    
        
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            
            <file>${log.path}/log_error.logfile>
            
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
                <charset>UTF-8charset> 
            encoder>
            
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MBmaxFileSize>
                timeBasedFileNamingAndTriggeringPolicy>
                
                <maxHistory>15maxHistory>
            rollingPolicy>
            
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERRORlevel>
                <onMatch>ACCEPTonMatch>
                <onMismatch>DENYonMismatch>
            filter>
        appender>
    
        
        
        
        <springProfile name="dev">
            
            <logger name="com.guli" level="INFO" />
    
            
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="INFO_FILE" />
                <appender-ref ref="WARN_FILE" />
                <appender-ref ref="ERROR_FILE" />
            root>
        springProfile>
    
    
        
        <springProfile name="pro">
    
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="DEBUG_FILE" />
                <appender-ref ref="INFO_FILE" />
                <appender-ref ref="ERROR_FILE" />
                <appender-ref ref="WARN_FILE" />
            root>
        springProfile>
    configuration>
    
    

    结果:
    在这里插入图片描述
    ![在这里插入图片描述)

  • 相关阅读:
    NX二次开发-UFUN查询对象的类型和子类型UF_OBJ_ask_type_and_subtype
    【Verilog】布斯算法(Booth Algorithm)乘法器的 Verilog 实现
    c刷题(四)
    C++ 基础(十二)函数-题目练习
    Xcode中App图标和APP名称的修改
    半监督学习理解
    数据增强(扩充)适合初学者
    鱼哥赠书活动第②期:《AWD特训营:技术解析、赛题实战与竞赛技巧》《ATT&CK视角下的红蓝对抗实战指南》《智能汽车网络安全权威指南》上下册
    【深度学习】常用算法生成对抗网络、自编码网络、多层感知机、反向传播等讲解(图文解释 超详细)
    从0开始实现深度估计
  • 原文地址:https://blog.csdn.net/weixin_45565886/article/details/127036314