在生产环境中,针对具体问题的追踪,没有debug,只有利用logger排查问题,这就要求我们打印logger,具体有哪些logger呢?
1.摘要日志
同步service层摘要日志,打印调用服务,入参,执行时间,执行结果
异步事件接收摘要日志,打印调用服务,入参,执行时间,执行结果
dal层摘要日志
intergration摘要日志
摘要日志,一般由拦截器负责打印,和具体的业务解耦
2.性能日志
针对系统中某种业务超过时间阀值,则打印出具体的执行步骤和执行时间,从而找到系统的性能瓶颈
如:operatorA--900ms
--A1--400ms
--A11-300ms
--A12-100ms
--A2--300ms
--A3--200ms
3.业务异常日志
个人观点,凡是有if出现的地方,都需要打印具体的日志(当然要评估出具体的日志量和磁盘空间),以利于日后的问题排查。
当然每个地方都要求打印业务异常日志,确实会导致工作量比较大,这时可以利用本地线程编程,在第一次进入系统时,生成一个唯一的key(time或者其他,只要保证唯一即可),通过封装,每次打印业务异常日志时,也把key打印出来,这样一个线程的调用,即可用key关联起来。出现问题时,即可用 grep key *log搜出所有线索!
4.系统错误日志
针对由外围系统、db访问层导致的不可预测的错误,需要打印出日志
技术支持:
摘要日志--AOP技术
性能日志--基于本地线程的ThreadLocal和具体的打点,在每次打点时,写入ThreadLocal,在超出性能阀值时,将ThreadLocal中的打的点打印出。
业务异常日志和系统操作日志--需要一个异常拦截框架,比如
try{
do业务();
}catch(业务自定义RuntimeException e){
logger.warn("业务异常",e);
}catch(Exception e){
logger.warn("系统异常",e);
}