java日誌該如何輸出

日誌要求:

  • 重要日誌一定要打印到日誌文件
  • 日誌文件應該每天滾動一次,日誌多的可以每個小時滾動一次
  • 日期必須精確到毫秒,而不是秒
  • 確保日誌是按事件順序輸出
  • 【推薦】最好能打印調用方信息,比如訪問者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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章