一听隐、日志級別
ALL补鼻、TRACE、DEBUG雅任、INFO风范、WARN、ERROR沪么、FATAL硼婿、OFF
從左至右日志輸出由多到少。
生產(chǎn)環(huán)境使用INFO日志級別禽车,調(diào)試時可以設(shè)置為DEBUG級別寇漫。
針對Spring Boot的程序脖祈,使用配置中的logging.level.root控制默認(rèn)日志級別忆嗜。
啟動時可以使用logging.level.root參數(shù)做臨時設(shè)置。例如:
java -jar app.jar --logging.level.root=debug
二酣溃、日志分類
- 監(jiān)控日志
監(jiān)控系統(tǒng)內(nèi)關(guān)鍵點(diǎn)的動作钦勘,DEBUG級別可做打點(diǎn)使用陋葡,ERROR級別記錄程序異常。
- 業(yè)務(wù)日志
系統(tǒng)內(nèi)業(yè)務(wù)操作日志輸出彻采,例如:下單腐缤、支付捌归、后臺上下架商品等重要的操作。
- 統(tǒng)計(jì)日志
根據(jù)統(tǒng)計(jì)需要岭粤,對用戶操作進(jìn)行記錄惜索,例如:登錄、注冊剃浇、瀏覽商品等巾兆。
三、日志的觸發(fā)點(diǎn)和級別
- 監(jiān)控日志
觸發(fā)點(diǎn) | 日志級別 | 例子 |
---|---|---|
關(guān)鍵方法入口 | DEBUG | 記錄參數(shù) |
調(diào)用外部服務(wù) | DEBUG | REST API調(diào)用返回?cái)?shù)據(jù) |
耗時和資源占用高的方法 | DEBUG | 記錄處理時間虎囚、記錄資源消耗 |
定時任務(wù)啟動和結(jié)束 | DEBUG | 啟動時間及狀態(tài)角塑、結(jié)束時間及狀態(tài) |
容錯及恢復(fù) | DEBUG | 用戶目錄不存在,重新建立用戶目錄 |
可處置的操作異常 | WARN | 用戶登錄失敗 |
無法處置的程序異常 | ERROR | logger.error(各類參數(shù)或者對象 toString + "_" + e.getMessage(), e); |
主程序啟動和關(guān)閉 | DEBUG | 啟動時間及狀態(tài)淘讥、結(jié)束時間及狀態(tài) |
重要配置或環(huán)境變量 | DEBUG | 配置圃伶,環(huán)境變量 |
- 業(yè)務(wù)日志
觸發(fā)點(diǎn) | 日志級別 | 例子 |
---|---|---|
業(yè)務(wù)操作執(zhí)行后 | INFO | 關(guān)鍵業(yè)務(wù)操作記錄執(zhí)行結(jié)果,執(zhí)行人 |
- 統(tǒng)計(jì)日志
觸發(fā)點(diǎn) | 日志級別 | 例子 |
---|---|---|
需要進(jìn)行統(tǒng)計(jì)的操作 | INFO | 記錄用戶訪問信息蒲列,IP窒朋、耗時、下載量蝗岖;記錄資源用量信息 |
四侥猩、日志收集方式
1. Fluentd
將日志發(fā)送到遠(yuǎn)程日志中心,由Fluentd進(jìn)行收集抵赢,Elasticsearch存儲欺劳,Kibana展示。
附logback配置文件片段铅鲤。
logger monitor/business/stats 分別對應(yīng) 監(jiān)控/業(yè)務(wù)/統(tǒng)計(jì)日志
<appender name="FLUENT" class="ch.qos.logback.more.appenders.FluencyLogbackAppender">
<tag>${fluentTag}</tag>
<remoteHost>${fluentHost}</remoteHost>
<port>${fluentPort}</port>
<fileBackupDir>${logPath}</fileBackupDir>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern><![CDATA[%msg]]></pattern>
</layout>
</appender>
<logger name="monitor" class="ch.qos.logback.classic.AsyncAppender" additivity="false">
<appender-ref ref="FLUENT" />
<appender-ref ref="STDOUT" />
</logger>
<logger name="business" class="ch.qos.logback.classic.AsyncAppender" additivity="false">
<appender-ref ref="FLUENT" />
</logger>
<logger name="stats" class="ch.qos.logback.classic.AsyncAppender" additivity="false">
<appender-ref ref="FLUENT" />
</logger>
2. 控制臺
監(jiān)控日志還可以輸出到控制臺杰标。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
3.文件
重要的日志可以輸出到文件作為備份。
可以設(shè)置保存文件個數(shù)和磁盤占用總?cè)萘肯拗啤?/p>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/business.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- hourly rollover -->
<fileNamePattern>${logPath}/business.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
五彩匕、記錄日志
參考阿里巴巴Java開發(fā)手冊
應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的 API媒区,而應(yīng)依賴使用日志框架 SLF4J 中的 API驼仪,使用門面模式的日志框架,有利于維護(hù)和各個類的日志處理方式統(tǒng)一袜漩。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger monitorLogger = LoggerFactory.getLogger("monitor");
private static final Logger businessLogger = LoggerFactory.getLogger("business");
private static final Logger statsLogger = LoggerFactory.getLogger("stats");
接下來按照 三绪爸、日志的觸發(fā)點(diǎn)和級別 的說明,在程序中記錄日志宙攻。
注意點(diǎn):
- 使用占位符而不是字符串拼接
參考阿里巴巴Java開發(fā)手冊
說明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
如果日志級別是 warn奠货,上述日志不會打印,但是會執(zhí)行字符串拼接操作座掘,如果 symbol 是對象递惋, 會執(zhí)行 toString()方法柔滔,浪費(fèi)了系統(tǒng)資源,執(zhí)行了上述操作萍虽,最終日志卻沒有打印睛廊。
正例:(條件)
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
}
正例:(占位符)
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
- 異常輸出適當(dāng)?shù)娜罩?/li>
捕獲不可控的異常,應(yīng)該輸出現(xiàn)場信息和異常堆棧信息杉编,不要將異常再拋至上層超全,避免上層再次輸出。
日志例:
logger.error(各類參數(shù)或者對象 toString + "_" + e.getMessage(), e);
異常堆棧信息是多行邓馒,在Kibana中會出現(xiàn)多條嘶朱,不便于查看。建議在Fluent中添加合并插件光酣,將異常堆棧信息合并為一行再輸出到Elasticsearch疏遏。