一、前言
日志是表现当前程序运行的状态、记录之前程序运行轨迹定位问题来源的,当前的测试及生产环境中,如果没有稳定日志的输出,是很让开发者提心吊胆的,但是如果有太多杂乱又无意义的日志也是令人伤神。
当程序出现问题时候,如果能直接从日志中发现问题,问题解决的效率便会加倍提升,而发现不了问题可能的原因是很令人受挫的。
本文想讨论的就是在程序中需要重视起来的日志规范。
二、正文
日志内容
一条完整的日志,是能够清晰的描述这条日志发生的完整的上下文、关键数据及时间点的,就如同描述一个故事一样,不然其实是没有任何意义的。
用于追踪和记录数据的日志就必须要有以下几大要素:when who where how what
即什么时候哪个东西(人) 在哪个模块做了什么事,这个东西可以是各种对象的id或者是请求的链路id(traceId),有了这几大要素之后,便能形成一个完整的可追踪的日志记录。如下:
2019年6月10日22:28:51 用户21312421 在订单模块下单了商品,商品id:10000;
日志级别
除了一些可以追查的业务日志,同时也会输出一些错误日志或者在开发阶段打印出来的调试日志(详细数据或者执行sql等),其中部分日志级别如下:
1、ERROR定义:输出一些错误信息,主要是指程序会出现的运行期错误
2、WARN定义:输出一些警告信息,如出现了预期之外的数据问题,但程序依旧可以运行,如缓存服务有问题等
3、INFO定义:主要是记录系统运行状态等关联信息,如摸个用户查询订单的数据
4、DEBUG定义:调试信息,主要用在调试期间开发环境的参数追踪,如mybatis的sql信息
日志代码规范
这里主要是讲的java项目中打印日志的规范。
- 如果出现错误应该是如下格式:
log.error("订单模块错误:{}",e);
而不应该用e.getMessage打印,log.error("订单模块错误:{}",e.getMessage); 这样则会不打印出错误的栈,很难清洗的定位问题;
- 在抛出异常前无需再重复打印出异常,如下:将会打印出两行相同的错误堆栈信息;
log.error(e);
throw new Exception(e);
- 尽量少打印无效重复且固定的日志输出,如下:一些固定的商品列表,将会导致很多重复且无用的大量数据被打印出来;
log.info("用户id:{}查询出商品列表:{}",userId,goodsList);
三、结语
本文总结了日志打印的几大要素、日志打印的级别区别、java编码中日志的规范编码等,希望能在使用日志这一个工具的时候能找到自己的需求,从而制定出适合的日志规范。