sprign boot實戰(zhàn)之日志

日志是運維武翎、排錯的一個重要助手,很多人應該都維護過沒有日志的項目榜掌,知道排查問題是什么感覺优妙。所以搭建基礎項目框架時,自然不能少了日志憎账。

日志組件選擇

從網上各種搜索對比套硼,在log4j2和logback之間選擇了log4j2,綜合各處評價,log4j2在性能方法有一定優(yōu)勢胞皱。但是在一個項目內使用后就發(fā)現邪意,spring boot內log4j2不支持spring profile機制,也就是在本地環(huán)境反砌、測試環(huán)境雾鬼、預發(fā)布環(huán)境、正式環(huán)境需要手動切換配置宴树,當前公司的多個環(huán)境在相同的服務器上策菜,所以這種方式會導致多個環(huán)境的日志生成在了同一個文件內,很不利于問題排查酒贬。因此又將日志組件換回了logback又憨,因為對當前公司的項目來說,日志支持profile機制更重要锭吨,性能瓶頸絕不在日志這塊蠢莺。

logback配置

spring boot內配置logback還是很簡單的,只需要在src/main/resources目錄下創(chuàng)建logback-spring.xml零如,在xml內添加自己的日志配置即可躏将。支持三個環(huán)境local、dev埠况、prod的日志配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="30 seconds">
    <property name="LOG_PATH" value="/mnt/diskb/logs"/>

    <springProfile name="local">
        <logger name="com.onecoderspace" level="debug" additivity="true"/>
        <appender name="logfile" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ssS} %5p [%c]:%L-%m%n</pattern>
            </encoder>
        </appender>
    </springProfile>

    <springProfile name="dev">
        <logger name="com.onecoderspace" level="info" additivity="true"/>
        <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_PATH}/projectName/projectName_dev.log</file>
            <append>true</append>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ssS} %5p [%c{5}#%M]:%L-%m%n%caller{0}</pattern>
            </encoder>
            <prudent>false</prudent>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- daily rollover -->
                <fileNamePattern>${LOG_PATH}/projectName/projectName_dev.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>
    </springProfile>
    
    <springProfile name="prod">
        <logger name="com.onecoderspace" level="info" additivity="true"/>
        <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_PATH}/projectName/projectName.log</file>
            <append>true</append>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ssS} %5p [%c{5}#%M]:%L-%m%n%caller{0}</pattern>
            </encoder>
            <prudent>false</prudent>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- daily rollover -->
                <fileNamePattern>${LOG_PATH}/projectName/projectName.%d{yyyy-MM-dd}.log.gz
                </fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>
    </springProfile>
    
    <root level="info">
        <appender-ref ref="logfile" />
    </root>

</configuration>

spring-boot-starter-web內已經包含了logback和slf4j的依賴耸携,所以只要項目依賴了spring-boot-starter-web,就不需要做其他額外的配置了辕翰。

日志使用

調用日志時建議使用slf4j夺衍,雖然基本不會在后續(xù)變更日志組件,但使用slf4j是一個好的習慣喜命。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static Logger logger = LoggerFactory.getLogger(LoginController.class);

debug日志
debug日志建議添加logger.isDebugEnabled()判斷沟沙,在重要的流程上都留下日志河劝,這樣當系統出現問題時,可以通過debug日志矛紫,快速定位問題赎瞎,能代替很多斷點調試的時間。

if(logger.isDebugEnabled()){
    logger.debug("user={} login success",username);
}

info日志
比較重要的信息颊咬,對于系統運行有比較重要的參考意義务甥,同時不會對性能造成影響,可以在正式環(huán)境展示的信息喳篇,使用info基本打印敞临,如定時任務運行時間等。

logger.info("end fetcher proxy use time={}", System.currentTimeMillis()- t);

error日志
error日志相對來說是最重要的麸澜,但使用時需要注意使用方式挺尿,不正確的方式會導致很多信息被隱藏〈栋睿可以參考如下方式:

logger.error(String.format("error msg ,arg1=%s,arg2=%s",arg1,arg2), e);
  • 盡可能的帶上異常發(fā)生時的參數编矾,這個對排查問題很有意義
  • 打印異常的完整堆棧信息,僅打印e.getMessage()會導致很多信息被隱藏
  • 只在異常發(fā)生時或明確的業(yè)務錯誤時使用error馁害,不要用error來打印調試窄俏、普通信息

總結

  1. spring boot項目內日志組件選擇logback比較好,內嵌的日志組件蜗细,支持profile機制裆操;
  2. logback配置方式為在src/main/resources目錄下創(chuàng)建logback-spring.xml怒详,配置內容參考上文炉媒;
  3. 調用日志時使用slf4j,注意合理使用日志級別
  4. 注意以下幾點tips
tips

1昆烁、 應用日志盡量放在數據盤上吊骤,不要放在系統盤上,遇到了不止一次日志寫滿系統盤導致服務暫停的情況
2静尼、 技術負責人定好日志規(guī)范白粉,在代碼review時指出幾次日志使用的問題,能夠很快讓良好使用日志成為團隊的習慣
3鼠渺、 正式環(huán)境的日志基本最低為info鸭巴,通常可以調整為warn或error
4拦盹、 在while循環(huán)內有異常捕獲時鹃祖,注意當異常發(fā)生時,不能無限打印日志普舆,如下代碼:

while (flag) {
    try {
        byte[] bb = _queue.poll(1, TimeUnit.SECONDS);
        if (bb != null) {
            @SuppressWarnings("unchecked")
            Map<String, Object> m = JacksonSupport.decode1(new ByteArrayInputStream(bb), Map.class);
            E event = _consumer.getEventType().newInstance();
            event.fromMap(m);
            _consumer.onEvent(event);
        }
    } catch (Exception e) {
        logger.error("redis queue poll due to error", e);
    }
}

從基于redis開發(fā)的一個blockingQueue內獲取元素進行消費恬口,代碼運行了一年多十分正常校读,但是有一次幾乎把磁盤寫滿了,因為當時運維調整祖能,redis停掉了歉秫, _queue.poll這里就開始拋異常,然后下面就狂寫日志养铸,一直把磁盤寫滿雁芙。類似這樣的地方,可以進行一個計數钞螟,連續(xù)錯誤達到多少次却特,就終止循環(huán)并以某些方式提醒運維人員。
5筛圆、不要使用System.out.println()裂明,建議隔段時間全局搜索一次,發(fā)現了就在小組會議上提一下太援,很快這種現象就會杜絕

本人搭建好的spring boot web后端開發(fā)框架已上傳至GitHub闽晦,歡迎吐槽!
https://github.com/q7322068/rest-base,已用于多個正式項目提岔,當前可能因為版本問題不是很完善仙蛉,后續(xù)持續(xù)優(yōu)化,希望你能有所收獲碱蒙!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末荠瘪,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子赛惩,更是在濱河造成了極大的恐慌哀墓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喷兼,死亡現場離奇詭異篮绰,居然都是意外死亡,警方通過查閱死者的電腦和手機季惯,發(fā)現死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門吠各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勉抓,你說我怎么就攤上這事贾漏。” “怎么了藕筋?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵纵散,是天一觀的道長。 經常有香客問我,道長困食,這世上最難降的妖魔是什么边翁? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮硕盹,結果婚禮上符匾,老公的妹妹穿的比我還像新娘。我一直安慰自己瘩例,他們只是感情好啊胶,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垛贤,像睡著了一般焰坪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聘惦,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天某饰,我揣著相機與錄音,去河邊找鬼善绎。 笑死黔漂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的禀酱。 我是一名探鬼主播炬守,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剂跟!你這毒婦竟也來了减途?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤曹洽,失蹤者是張志新(化名)和其女友劉穎鳍置,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體衣洁,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡墓捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了坊夫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡撤卢,死狀恐怖环凿,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情放吩,我是刑警寧澤智听,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響到推,放射性物質發(fā)生泄漏考赛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一莉测、第九天 我趴在偏房一處隱蔽的房頂上張望颜骤。 院中可真熱鬧,春花似錦捣卤、人聲如沸忍抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠项。三九已至,卻和暖如春子姜,著一層夾襖步出監(jiān)牢的瞬間祟绊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工哥捕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留久免,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓扭弧,卻偏偏與公主長得像阎姥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸽捻,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容