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


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

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

    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>
    
    

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

  • 相关阅读:
    maven通过maven repository添加依赖包
    最新哔哩哔哩邮箱绑定接口签名JS逆向分析
    创建Vue项目的常用npm插件总结
    【 java 常用类】日期相关 API 操作
    基于MxNet实现目标检测-YoloV4【附部分源码及模型】
    基于UE高渲染的API开发
    python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)
    openstack部署2
    Golang学习笔记01
    思必驰周强:AI 和传统信号技术在实时音频通话中的应用
  • 原文地址:https://blog.csdn.net/weixin_45565886/article/details/127036314