logback.xml配置 異常信息不輸出到日志文件問(wèn)題

問(wèn)題

在springboot項(xiàng)目中, 配置logback.xml文件, 將info及以上等級(jí)的日志信息保存到info.log文件中, 將error等級(jí)的日志保存到error.log文件中. 項(xiàng)目啟動(dòng)后, 兩個(gè)日志文件已經(jīng)生成, 但是項(xiàng)目運(yùn)行過(guò)程中拋出異常, 異常信息并沒(méi)有輸出到error.log中.

logback.xml配置

logback.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>logback</contextName>
    <property name="log.path" value="/Users/tengjun/Documents/log" />
    <!--輸出到控制臺(tái)-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
     <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>ERROR</level>
      </filter>-->
      <encoder>
        <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
       </encoder>
    </appender>
<!--輸出到info文件-->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.info.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
      </appender>

   <!--輸出到error文件-->
   <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.error.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
     <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>error</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    </appender>
  <root level="info">
    <appender-ref ref="console" />
    <appender-ref ref="info" />
    <appender-ref ref="error" />  
  </root>
  </configuration>

問(wèn)題分析

在配置文件中, 分好日志類(lèi)型刨秆,日志也會(huì)按級(jí)別輸出相應(yīng)的文件。前提是我們自己調(diào)用了logger.info(), logger.error()等日志輸出方法。而RuntimeException是非jdk檢測(cè)異常, 我們不可能每次try{}catch(){}后使用logger.error(e.getMessage()), 而且這樣輸出的異常信息也沒(méi)有辦法把錯(cuò)誤的堆棧信息全部打印出來(lái). 這樣的話, 我們只能每次到控制臺(tái)上查看異常日志, 非常不方便.

解決方案

方案一

使用全局異常處理方案, 對(duì)所有異常的堆棧信息使用logger.error()進(jìn)行打印
代碼如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        logger.error(ExceptionUtils.getFullStackTrace(e));  // 記錄錯(cuò)誤信息
        String msg = e.getMessage();
        if (msg == null || msg.equals("")) {
            msg = "服務(wù)器出錯(cuò)";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", msg);
        return jsonObject;
    }
 }

缺點(diǎn): 采用全局異常處理, 只能攔截controller層的異常, 而service/dao的異常則不能捕獲, 指標(biāo)不治本

方案二

我們知道, 異常信息的打印流是System.err(...), 若要將打印流的異常信息輸出到文件中中, 則只能將系統(tǒng)打印流重定向至文件中, 如下:
System.setErr(new PrintStream(new FileOutputStream(file)));
缺點(diǎn): 重定向打印流到文件中, 則意味著該打印流只能輸出到文件, 而控制臺(tái)中則不會(huì)打印異常信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末风皿,一起剝皮案震驚了整個(gè)濱河市拢驾,隨后出現(xiàn)的幾起案子美侦,更是在濱河造成了極大的恐慌宠蚂,老刑警劉巖乓土,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦裂,死亡現(xiàn)場(chǎng)離奇詭異似枕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)年柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)凿歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人彪杉,你說(shuō)我怎么就攤上這事毅往。” “怎么了派近?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵攀唯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我渴丸,道長(zhǎng)侯嘀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任谱轨,我火速辦了婚禮戒幔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘土童。我一直安慰自己诗茎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布献汗。 她就那樣靜靜地躺著敢订,像睡著了一般王污。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上楚午,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天昭齐,我揣著相機(jī)與錄音,去河邊找鬼矾柜。 笑死阱驾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怪蔑。 我是一名探鬼主播里覆,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饮睬!你這毒婦竟也來(lái)了租谈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捆愁,失蹤者是張志新(化名)和其女友劉穎割去,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昼丑,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呻逆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菩帝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖城。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呼奢,靈堂內(nèi)的尸體忽然破棺而出宜雀,到底是詐尸還是另有隱情,我是刑警寧澤握础,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布辐董,位于F島的核電站,受9級(jí)特大地震影響禀综,放射性物質(zhì)發(fā)生泄漏简烘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一定枷、第九天 我趴在偏房一處隱蔽的房頂上張望孤澎。 院中可真熱鬧,春花似錦欠窒、人聲如沸覆旭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姐扮。三九已至絮供,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茶敏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工缚俏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惊搏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓忧换,卻偏偏與公主長(zhǎng)得像恬惯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亚茬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355