java 日志开发规范

1.记录日志原因

  • 记录操作轨迹
  • 监控系统运行状况
  • 回溯系统故障

2.不同日志级别的处理方式

1.预先判断日志级别

对DEBUG、INFO级别的日志,必须使用条件输出或者使用占位符的 方式打印。

例如:

在某个配置了打印日志级别为WARN的应用中,如果针对DEBUG级别的日志,仅仅在程序总写出logger.debug("dd"+symbol);

那么该 日志不会被打印,但是会执行字符串拼接操作;如果symbol是对象,还会执行**toString()**方法,白白浪费了资源。以下是正确 的打印日志的方式:

//使用条件判断方式
if(logger.isDebugEnabled()){
  logger.debug();
}
// 使用占位符
logger.debug(”name{},name);

2.避免无效打印日志

生产环境禁止出书DEBUG日志且有选择地输出INFO日志。

使用INFO WARN 级别来记录业务行为信息时,一定要控制日志输出量,以免磁盘空间不足,同时,要为日志文件设置合理的生命周期,及时清理过期的日志

避免重复打印,务必在日志文件配置中设置 additicity = false;

示例如下"

<logger name ="com.yaspeed.controller"

additivity = "false"/>

3.区别对待日志

WARN ERROR 都是与错误有关的日志级别,但不要一发生错误就笼统 地输出ERROR级别日志。一些业务异常时可以通过引导 重试就能恢复正常的,例如用户输

入参数错误。

在这种情况下,记录日志时为了在用户咨询时可以还原现场,如果输出为ERROR级别就标识一旦出现就需要人为介入,这显然不合理。

所以 ERROR 级别只记录系统逻辑错误、异常或者违反重要的业务规则,其他错误都可以归为WARN级别。

4.保证记录内容完整

记录异常时一定要输出异常堆栈,例如logger.error(“XXX”,e.getMessage(),e);

日志中如果输出对象实例,要确保实例类 重写了日志中如果输出对象实例,要确保实例类 重写了toString方法,否则只会输出对象的hashCode值,没有实际以及

方法,否则只会输出对象的hashCode值,没有实际意义!

3.记录日志考虑三个问题

  • 日志是否有人看
  • 看这条日志能干设呢么
  • 能不能提升问题排查效率

4.日志规范

  1. 【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个

    类的日志处理方式统一

    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory;
    private static final Logger logger = LoggerFactory.getLogger(Abc.class); 
    
  2. 【强制】日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。

  3. 【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:

    appName_logType_logName.log。logType:日志类型,推荐分类有

    stats/desc/monitor/visit 等;logName:日志描述。这种命名的好处:通过文件名就可知

    道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。

    正例:mppserver 应用中单独监控时区转换异常,如:

    mppserver_monitor_timeZoneConvert.log

    说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。

  4. 【强制】对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。

    说明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);

    如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString()方法,浪费了系统资源,执行了上述操作,

    最终日志却没有打印。

    正例:(条件)

    if (logger.isDebugEnabled()) {
    logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
    }

    正例:(占位符)

    logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);

  5. 【强制】避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false。

    正例:

  6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。

    正例:logger.error(各类参数或者对象 toString + “_” + e.getMessage(), e);

  7. 【推荐】谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出

    量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。

    说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请

    思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?

  8. 【参考】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error 级别只记录系统逻辑出错、异

    常等重要的错误信息。如非必要,请不要在此场景打出 error 级别。

你可能感兴趣的:(日志,日志开发规范)