1.Log4j不打印异常栈的问题
情景是这样,线上发现空指针异常,但是没有打印异常栈,同事查看代码,发现打印日志的用的组件是Log4j,api是log4j中的error(Object message)方法,这个方法是不打印异常栈的,同时log4j还提供了个重载方法error(String msg,Throwe e),这个方法是可以打印异常栈的。开发代码的时候不小心用错了方法。其实出现问题的这个项目里面用到的是logback,只是log4j的jar包也在,不小心引用错了。
总结:建议使用logback,因为logback的error方法error(String msg, Throwable t)。同时一个项目里面不要引入不同的日志组件,打印日志特别是错误日志注意打印"案发现场"
2.上线打包代码不全
同事A要上线,直接打了个本地war包,放到了线上,他忘记了同事B又修改了bug,然后也将代码提交了,导致这一部分代码没有部署到线上环境,结果可想而知,qa的回归的时候又发现了测试中的bug。
总结:线上发布版本,要直接从git上拉取,不能本地打包。或者干脆提测的版本1个tag号打出2个包,这2个包只是配置不一样.测试通过直接将这个tag的正式包放到线上!
3 包含远程服务的事务
一个事务内部包含了几个db操作,还有1个发放代金券的接口,最后一个记录日志到db里面的操作。由于某种原因,最后一个记录db操作的方法执行错误,导致整个事务回滚,但是发放代金券的接口却没有回滚,导致了非常严重的问题,发放了代金券却没执行扣款操作。
总结:包含远程服务的事务,要格外小心整个数据的一致性,一般的做法是将远程服务放到方法最后,上面的例子显然也做到了这一点,只是没有对最后一个记录日志的操作异常捕获!也可以对整个业务块加个try-catch,发生了错误先回滚发放代金券的接口,如回滚成功,抛异常,回滚db操作!