log 的 debug()


开发过程中或多或少我们会用到日志,市面中有很多种这里我们说说log4j,其实不管用什么,都是大同小异的,一般有5个日志级别:

  • DEBUG:程序调试bug时使用
  • INFO:程序正常运行时使用
  • WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
  • ERROR:程序出错误时使用,如:IO操作失败
  • Fatal :特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用
  • 默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。
  • 日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < Fatal 

1. Debug
      最低级别的,在实际运行过程中,不输出的。因此这个级别的信息,可以随意的使用,任何觉得有利于在

调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。
2. Info 
        这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,info输出的信息可以看做是程序的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。
3. Warn、Error、Fatal 
        警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:
        所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。
        所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。
        所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

        也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

话不多说看如下的例子:

/**
    * 计算活动后的sku价格
    * @param marketActivityDTO 活动计算入参
    * @return
   **/
   public MarketActivityVO calculate(MarketActivityDTO marketActivityDTO) {
        StopWatch stopWatch=new StopWatch();
        stopWatch.start();
        try {
            log.info("----------[优惠券计算-优惠券id:{},输入参数:{}]",marketActivityDTO.getCouponId(),JSON.toJSONString(marketActivityDTO));

            //校验-是否使用优惠券、商品是否是空的
            if(this.validate(marketActivityDTO)){
                return null;
            }

            //调用领域层接口-查询优惠券详情 [商品、叠加使用]
            String url=ApolloConfigAppletConstants.ServerVersionUrl.QUERY_COUPON_DETAIL_URL;
            Integer couponId=marketActivityDTO.getCouponId();
            Map<String,Object> params=new HashMap<>(4);
            params.put("id",couponId);
            log.debug("----------[优惠券id:{},领域层请求参数:{}]",couponId,params);
            Map<String,Object> responseResult = HttpInvoikeUtils.commonHttpInvoke(url, params, Map.class);
            log.debug("----------[优惠券id:{},领域层请求结果:{}]",couponId,responseResult);
            CouponNewVO couponVo= ConvertUtil.convertResponseMapToObject(responseResult, CouponNewVO.class);
            if(null==couponVo){
                log.error("----------[优惠券id:{},领域层请求异常,没有请求到优惠券信息]",couponId);
                return null;
            }

            //是否满足优惠券的使用规则
            if(!this.validateRule(marketActivityDTO,couponVo)){
                return null;
            }

            //优惠券优惠处理
            MarketActivityVO marketActivityVO=this.couponHandler(marketActivityDTO,couponVo);
            //优惠券类型
            marketActivityVO.setCouponType(couponVo.getActivityType());
            stopWatch.stop();

            log.info("=+=优惠券计算耗时:{}毫秒",stopWatch.getTotalTimeMillis());
            log.info("----------[优惠券计算-优惠券id:{},最终结算结果:{}]",couponId,JSON.toJSONString(marketActivityVO));

            return marketActivityVO;
        } catch (Exception e) {
            log.error("优惠券计算异常,详情:{}",e);
            return null;
        }

    }