日誌要求:
- 重要日誌一定要打印到日誌文件
- 日誌文件應該每天滾動一次,日誌多的可以每個小時滾動一次
- 日期必須精確到毫秒,而不是秒
- 確保日誌是按事件順序輸出
- 【推薦】最好能打印調用方信息,比如訪問者ip等信息
- 日誌文件要可以方便使用grep語句查看
- 日誌文件歸檔:需要告知運維歸檔
- 日誌預警,通過ES實現
- 對於無法預知的異常,一定要打印堆棧:LOGGER.error("context:{},exception:{}", JSON.toJSONString(context), e);
- 打印錯誤信息時,要打印訪問的上下文
- 對於調用接口返回錯誤的日誌(暫定):
如果爲1代表系統異常,打印error級別來預警,否則打印warn級別或者info級別
工具:
項目儘可能的使用log4j2 或者 logback,並且使用slf4j接口打印日誌:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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格式日誌:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.5.1</version>
</dependency>
** logback.xml配置:**
<appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/log.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/log.json.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<jsonFactoryDecorator class="com.sq.proxy.config.MyJsonFactoryDecorator" />
<providers>
<timestamp>
<pattern>yyyy-MM-dd'T'HH:mm:ss.SSSZZ</pattern>
</timestamp>
<pattern>
<pattern>{"level":"%level","service":"${springAppName:-}","host":"%ip","pid":"${PID:-}","thread":"%thread","class":"%logger{40}:%L","message": "%message"},</pattern>
</pattern>
</providers>
</encoder>
</appender>
打印堆棧:
java 代碼:
logger.error("getBalanceHint() 異常:{}", ExceptionUtils.getFullStackTrace(e));