日志规范

441 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天

日志规范

日志要求:

  • 重要日志一定要打印到日志文件

  • 日志文件应该每天滚动一次,日志多的可以每个小时滚动一次

  • 日期必须精确到毫秒,而不是秒

  • 确保日志是按事件顺序输出

  • 【推荐】最好能打印调用方信息,比如访问者ip等信息

  • 日志文件要可以方便使用grep语句查看

  • 日志文件归档:需要告知运维归档

  • 日志预警,通过ES实现

  • 对于无法预知的异常,一定要打印堆栈:LOGGER.error("context:{},exception:{}", JSON.toJSONString(context), e);

  • 打印错误信息时,要打印访问的上下文

  • 对于调用接口返回错误的日志(暂定):

  • 如果为1代表系统异常,打印error级别来预警,否则打印warn级别或者info级别

 

工具:

项目尽可能的使用log4j2 或者 logback,并且使用slf4j接口打印日志:

1.  import org.slf4j.Logger;  

2.  import org.slf4j.LoggerFactory;  

3.  private static final Logger logger = LoggerFactory.getLogger(Abc.class);  

日志要分级别打印:

trace:跟踪日志,与debug差别不大

debug:调试问题使用,一定要打印出输入、输出数据

info:打印程序运行信息,启动信息等

warn:打印一些警告信息,比如参数校验错误等等

error:打印程序错误信息,必须要打印上下文信息,方便查找问题

fatal:重大灾难信息,比如数据库无法连接等需要立即处理的问题

bussiness: 打印重要业务的日志,比如抢购成功、订单创建成功的相关信息、删除用户等

日志文件分开打印,便于查看和抓取日志:

  • *.debug.log

  • *.info.log

  • *.warn.log

  • *.error.log

  • *.biz.log

ELK日志收集预警:

为了ELK收集方便,日志可以打印成json格式:

info.json

warn.json

error.json

error级别日志3分钟预警,发送邮件

warn级别日志10分钟预警,发送邮件

logback可以使用logstash-logback-encoder来打印json格式日志:

1.  <dependency>  

2.      <groupId>net.logstash.logback</groupId>  

3.      <artifactId>logstash-logback-encoder</artifactId>  

4.      <version>4.5.1</version>  

5.  </dependency>  

 logback.xml配置:

1.  <appender name="LOGSTASH" **class**="ch.qos.logback.core.rolling.RollingFileAppender">  

2.      <file>${LOG_HOME}/log.json</file>  

3.      <rollingPolicy **class**="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  

4.          <fileNamePattern>${LOG_HOME}/log.json.%d{yyyy-MM-dd}</fileNamePattern>  

5.          <maxHistory>7</maxHistory>  

6.      </rollingPolicy>  

7.      <encoder **class**="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">  

8.          <jsonFactoryDecorator **class**="com.sq.proxy.config.MyJsonFactoryDecorator" />  

9.          <providers>  

10.             <timestamp>  

11.                 <pattern>yyyy-MM-dd'T'HH:mm:ss.SSSZZ</pattern>  

12.             </timestamp>  

13.             <pattern>  

14.                 <pattern>{"level":"%level","service":"${springAppName:-}","host":"%ip","pid":"${PID:-}","thread":"%thread","class":"%logger{40}:%L","message""%message"},</pattern>  

15.             </pattern>  

16.         </providers>  

17.     </encoder>  

18. </appender>  

java 代码:

1.  logger.error("getBalanceHint() 异常:{}", ExceptionUtils.getFullStackTrace(e));