一、日志 API

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

Lombok Slf4j 注解方式

import lombok.extern.slf4j.Slf4j;
  
@Slf4j
public class Fooooo {
  public void barrrr() {
    log.info("hello world ...");
  }
}

二、日志输出

1.【强制】通用格式为:“DESC. [key1={}, key2=‘{}’, key3={}]”,例如:

log.info("execute one query request. [request='{}', response='{}', elapse={}, cacheResponse='{}']", json, queryResponseJson, elapse, queryContext.getCacheResponse());
log.warn("try to re-query for incomplete query. [sql='{}']", sql, e);

“DESC” 为行为描述,一句有区分度的话,以".“结尾。目的:作为 “Anchor” 及锚点,能够用来定位一类问题,它需要有辨识度,需要能通过 GREP 简单地过滤到。
“[key1={}, key2=‘{}’, key3={}]” 为案发现场上下文,其中的 key 的命名遵循Java变量命名规范,而如果 value 为字符串,建议加上单引号。
必须使用占位符”{}"代替字符串拼接。
2.【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。

log.error(“execute one query request. [request=‘{}’, response=‘{}’, elapse={}, cacheResponse=‘{}’]”, json, queryResponseJson, elapse, queryContext.getCacheResponse(), e);
3.【推荐】尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用中文描述即可,否则容易产生歧义。

三、日志配置 V1.0.0_NEW

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

2.【强制】注意日志使用级别,ERROR 级别只记录系统逻辑出错、异常或者重要的错误信息。

ERROR
当程序发生不可预期的错误(按照设计不应该发生)时。
或者不可恢复的错误(启动时初始化失败,直接退出)时。
WARN:
当程序发生可预期或者不影响主要功能的时候时使用。
INFO
用于追踪程序的正常执行。
典型的在 Web 模块中,任何一处 INFO 日志的输出在一次 Web Request 中被调用的次数应该是 “常量级” 别的,且大部分情况下这个常量应该是 1。
DEBUG
调试日志,DEBUG 日志打印的量没有限制,但需要注意不要影响执行性能。
3.【强制】 garden-log-starter 默认提供 logback.xml 日志配置,禁止各产品线自定义日志配置,如有特殊日志配置需求,请反馈。

garden-log-starter 支持各产品线 run.sh JVM 参数动态配置日志,如下:

注意:配置不再加前缀区分产品线,比如:sa.log.dir 应改为 log.dir,同时也兼容sa.log.dir

-Dlog.dir=/Users/TaoBangren/Desktop
-Dlog.file=web.log
-Dextra.log.file=extra.log
-Daccess.log.file=access.log
-Droot.logger=DEBUG,DRFA
-Dcustom.logger=DEBUG,DRFA,analytics
-Dsensors.logger=DEBUG # 指定com.sensorsdata下Logger的级别
-Dapp.type=standalone # 指定应用类型,可以选择不同的日志格式
-Dfile.max.history=14 # 指定 log 文件最大保留天数,默认 14 天
-Daccess.web.async=true # 可选,异步打印 web access log,适用于对性能特别敏感的服务,一般无需开启
-Daccess.grpc.async=true # 可选,异步打印 grpc access log,适用于对性能特别敏感的服务,一般无需开启
使用 logback 需要 Maven 依赖 garden-log,pom.xml 配置如下:
<dependency>
  <groupId>com.sensorsdata.starter</groupId>
  <artifactId>garden-log-starter</artifactId>
  <version>1.4.x</version>
</dependency>

扩展 logback.xml 配置,需在src/main/resources目录下,增加 custom_logback.xml :

<included>
  <!-- 标识是否有自定义log -->
  <property name="CUSTOM_LOGGER" value="true" />
 
  <logger name="net.sf.ehcache" level="DEBUG" additivity="false"/>
  <logger name="org.springframework.security" level="DEBUG" additivity="false"/>
  <logger name="shaded.org.apache" level="DEBUG" additivity="false"/>
  <logger name="org.apache" level="DEBUG" additivity="false"/>
  <logger name="org.apache.velocity" level="DEBUG" additivity="false"/>
  <logger name="org.apache.myfaces" level="DEBUG" additivity="false"/>
  <logger name="org.dbunitorg.springframework" level="DEBUG" additivity="false"/>
  <logger name="org.springframework" level="DEBUG" additivity="false"/>
  <logger name="org.hibernate" level="DEBUG" additivity="false"/>
</included>

四、日志性能

【推荐】禁止在循环体内、被频繁调用的方法、回调方法内,打 log 要小心。如无必要,一律禁止。
【推荐】对于 trace/debug 级别的日志输出,必须进行日志级别的判断,才可输出日志。如无性能损耗的生成日志内容,此条规范可选。

// 如果判断为真,那么可以输出 trace 和 debug 级别的日志
if (logger.isDebugEnabled()) {
  logger.debug("desc log. [id={}, name='{}']", id, getName());
}

五、栈信息打印

try {
} catch (Exception e){
	log.error("dsfs", e); // 会打印栈信息到 log 文件。而不是标准输出
	e.printStackTrace();	// 会打印到标准输出,不推荐这种方法
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐