象群科技开发日志规范

前言

一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神。程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的。本文讨论的是如何在Java程序里写好日志。

一般来说日志分为两种:业务日志和异常日志,使用日志我们希望能达到以下目标:
1.对程序运行情况的记录和监控;
2.在必要时可详细了解程序内部的运行状态;
3.对系统性能的影响尽量小;

日志框架

Slf4j - SLF4J是为各种Logging API提供一个简单统一的接口),从而使用户能够在部署的时候配置自己希望的Logging API实现,Spring boot依赖树里边已经包含slf4j依赖,使用Spring boot框架不需要单独加其依赖,本项目中使用Slf4j 做日志框架。

日志实践

日志使用


1.使用idea首先需要安装Lombok插件;
2.在pom文件加入lombok的依赖;
3.类上面添加@Sl4j注解,然后使用log打印日志,示例如下:

日志分级

日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error->fatal

fatal - 严重的,造成服务中断的错误(生产、测试、开发环境);

error - 其他错误运行期错误,如异常的捕捉(生产、测试、开发环境);

warn - 警告信息,如程序调用了一个即将作废的接口,接口的不当使用,运行状态不是期望的但仍可继续处理等(生产、测试、开发环境);

info - 有意义的事件信息,如方法参数、返回结果,关闭事件,收到请求事件等(生产、测试、开发环境);

debug - 调试信息,如sql的打印等(生产、测试、开发环境);

trace - 更详细的跟踪信息(测试、开发环境);

Java的日志框架一般会提供以下日志级别,缺省打开info级别,trace级别的日志在生产环境不会输出,在开发和测试环境可以通过不同的日志配置文件打开debug级别。

编码规范

在大象加气平台的开发过程中,暂时使用debug、info、error三种级别,编码遵守以下规范:

1.根据实际需要,暂只输出三个级别(debug、info、error)的日志文件;

2.控制器获取参数添加info日志,内容格式为: “调用module名+PostMappingURL+参数,+参数1:{},参数2:{},参数3:{},....”注,RequestBody参数需要转成json格式,如JSON.toJSONString(user),示例如下:

3.控制器调用Service方法时: “调用方法:{},参数2:{},参数3:{},..返回值:{}.”,注,对象参数需要转成json格式,如JSON.toJSONString(org),注:如果是多条件查询,返回列表;如果是无条件查询,不要返回结果集,返回结果集的大小即可,示例如下:

4.重要接口或方法的调用,内容格式为: “接口名+param,+参数1:{},参数2:{},参数3:{},....”,注,对象参数需要转成json格式,如JSON.toJSONString(org),示例如下:

5.error 级别,error 级别只记录系统逻辑出错、异常等重要的错误信息。如非必要,请不要在此场景打出 error 级别。异常日志,注意日志输出的级别,输出Exceptions的全部Throwable信息,因为log.error(msg)和log.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的StackTrace信息。示例如下:

6.不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志;不要使用 e.printStackTrace();

7.不要使用 System.out.print..输出日志的时候只能通过日志框架来输出日志,而不能使用 System.out.print… 来打印日志,这个只会打印到 tomcat 控制台,而不会记录到日志文件中,不方便管理日志,如果通过服务形式启动把日志丢弃了那更是找不到日志了;

8.不要使用错误的日志级别,曾经在线上定位一个问题,同事自信地和我说:明明输出了日志啊,为什么找不到…,后来我去看了下他的代码,是这样的:

9.不要在千层循环中打印日志,这个是什么意思,如果你的框架使用了性能不高的 Log4j 框架,那就不要在上千个 for循环中打印日志,这样可能会拖垮你的应用程序,如果你的程序响应时间变慢,那要考虑是不是日志打印的过多了。

for(int i=0; i<2000; i++){log.info("XX");}

10.禁止生产环境输出 debug 日志;有选择地输出 info 日志;如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志;sql信息可以。

配置规范

1.日志日志文件推荐至少保存 30 天;

2.开发环境级别为trace,测试环境为debug,生产环境为info。

开发环境配置

测试环境配置

生产环境配置

SQL日志配置

注:sql打印出,针对对应的module修改路径,比如pay module下为