首页 > 技术文章 > 日志规范

ls-shiyi 2019-06-10 22:47 原文

一、前言

日志是表现当前程序运行的状态、记录之前程序运行轨迹定位问题来源的,当前的测试及生产环境中,如果没有稳定日志的输出,是很让开发者提心吊胆的,但是如果有太多杂乱又无意义的日志也是令人伤神。

当程序出现问题时候,如果能直接从日志中发现问题,问题解决的效率便会加倍提升,而发现不了问题可能的原因是很令人受挫的。

本文想讨论的就是在程序中需要重视起来的日志规范。

二、正文

日志内容

一条完整的日志,是能够清晰的描述这条日志发生的完整的上下文、关键数据及时间点的,就如同描述一个故事一样,不然其实是没有任何意义的。

用于追踪和记录数据的日志就必须要有以下几大要素: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编码中日志的规范编码等,希望能在使用日志这一个工具的时候能找到自己的需求,从而制定出适合的日志规范。

 

 

 

推荐阅读