在日常开发过程中,日志是代码的必要组成部分,一个好的代码也必然有一个好的日志输出,优秀的日志不仅可以快速帮助我们分析定位问题还可以在对日志的数据挖掘中产生很大的威力。
1、java在发生异常时可以打印它的堆栈信息以帮助调试,但是java的异常也有下列问题:
1)java出现异常时只能展示静态的调用堆栈信息,对应异常之前的调用参数则无法进行展示,也就是只知道哪里发生了异常,而不知道是哪些数据导致了异常;
2)java的异常堆栈通常是直接定位到某个文件的某一行,在发生异常时,如果不看代码都不知道异常详细情况,可读性比较差;
2、使用日志索引,具体为:
1)在一次调用的整个流程内部使用一个统一的索引,其格式为:<cid:索引号>
;
2)产生索引,对于任务类型的,一个任务的整个执行流程使用一个统一的索引;
3)索引可以由外部传入和内部自己生成两种方式,外部传入时,可以做到各服务模块之间的日志一致;内部生成时,一般在任务的执行之前产生;
4)索引的类型,可以使用long型整数;
3、在每条日志中都要首先输出该条日志所在的位置:类名或文件名以及该条日志所在的函数名,如此以来,在程序出现问题时,即使不用查看代码也能根据层级的日志显示看出问题出现的位置和原因,能极大提高问题解决的速度
4、日志输出格式:
[日志位置]<lid:日志索引>日志内容
例如:logger.warn(String.format("[UserInfo.checkUserInfo]<cid:%d>user name:%s", userName, logIndex));
在项目开发中,如果所有模块,无论语言,均采用这种日志输出模式,在后期日志收集和分析中将会有很大的用处
5、日志输出注意事项:
1)在任务执行之前和执行之后打印log,任务执行之前的log上带上当前任务的所有参数,任务执行结束的log尽量带上当前的处理结果;
2)在关键函数入口处(即进入该函数的开始位置)和出口前打印log,入口处的log带上当前的参数,出口处的log尽量带上当前的处理结果;
3)在错误和异常日志中带上错误和异常执行前的关键参数;在实际开发中经常会遇到各种条件判断,如果条件不满足,则返回错误,此时再返回之前尽量要输出一条log,并在该log上带上引起错误的参数,对于异常也是如此;
4)在关键代码前加上log,log要带上当前的重点参数;例如,有一段代码是向另外一个模块发送消息,则在发送消息之前最好加上log,log中要带上向哪里发送什么;
5)在有关键信息出现的地方加log,并在log中输出这些关键的信息;
6)日志描述要简洁清晰;
6、日志输出一定要分等级显示,例如debug,warn,error等;在log输出时要分级别显示:
如果遇到程序无法继续执行的情况,log级别是error;
如果程序虽然出错但是还依然可以继续运行,log级别是warn;
如果关键信息的输出可以使用info或者debug;
其他调试信息可以使用debug级别;
7、综合上述,在开发过程中需要做到以下两点:
1)所有函数的第一个参数都必须是long型的logIndex参数,例如:
String logIn(long logIndex, String userInfo);
2)所有的日志在自己输出内容的开头必须遵循格式:
[日志位置]<lid:日志索引>日志内容