異常日誌監控之日誌採集

1、 異常日誌監控概述

異常日誌監控十分重要,可以幫助開發和運維同學看到目前線上異常日誌的分類和頻率,能迅速定位到代碼,不必要登錄到機器上一個個查找,異常日誌監控平台能清晰的知道該異常類型在5分鐘內、15分鐘內、30分鐘內出現的次數和異常完整的堆棧信息,這樣在界面上展示出來一目了然。在中小公司可能沒有這樣的平台,基本上只有核心開發同學才有許可權登錄到跳板機去查線上日誌情況,一個開發團隊里,估計也只有3個人左右才有這樣的許可權。這樣的需求在大團隊開發就非常的明顯了,所以大的公司都會有這樣的監控平台。其實開發這樣的監控平台並不困難,今天就來異常日誌監控之日誌採集。

2、Log4j擴展&demo示例

在Log4j里,要繼承一個重要的抽象類AppenderSkeleton,重寫它的一個方法append(LoggingEvent event),整個日誌採集就在該方法里完成的。下面通過一個簡單的demo示例來說明。

/**

* Created by gaofla on 2018/3/8.

*/

public class AppenderTest extends AppenderSkeleton {

@Override

protected void append(LoggingEvent event) {

Level level = event.getLevel();

if (level == Level.ERROR) {

String stackTraceInfo = "";

ThrowableInformation errorInfo = event.getThrowableInformation();

LocationInfo locationInfo = event.getLocationInformation();

if (errorInfo != null) {

Throwable throwable = errorInfo.getThrowable();

StringWriter buf = new StringWriter();

throwable.printStackTrace(new PrintWriter(buf));

stackTraceInfo = buf.toString();

}

String codeInfo = locationInfo.fullInfo;

String logMessage = (String) event.getMessage();

if (stackTraceInfo.length() > 0) {

System.out.printf("stackTraceInfo=%s codeInfo=%s
logMessage=%s

", stackTraceInfo, codeInfo, logMessage);

} else {

System.out.printf("codeInfo=%s
logMessage=%s

", codeInfo, logMessage);

}

}

}

@Override

public void close() {

}

@Override

public boolean requiresLayout() {

return true;

}

}

再來一個測試例子看一下哈。

/**

* Created by gaofla on 2018/3/8.

*/

public class Test {

private static final Logger log = Logger.getLogger(Test.class);

public static void main(String args[]) {

String str = null;

log.error("Error log start print....");

try {

System.out.println(str.length());

} catch (Exception e) {

log.error("Exception.print", e);

}

}

}

看一下輸出了:

codeInfo=com.monitor.log.demo.Test.main(Test.java:16)

logMessage=Error log start print....

stackTraceInfo=java.lang.NullPointerException

at com.monitor.log.demo.Test.main(Test.java:18)

codeInfo=com.monitor.log.demo.Test.main(Test.java:20)

logMessage=Exception.print

3、總結

上面只是一個示例說明原理,要達到生產級別,還有一些事要做,後續拿一個真實的例子和大家分享。當然日誌監控有不同的方法,歡迎大家和我一起討論,可以加我微信(手機:13512717641)。

推薦閱讀:

AS自帶的 檢測工具Lint
android lint中的probable bugs

TAG:異常檢測 | 穩定性 | 日誌分析 |