近日測試中遇到一個需求,要使用程序不斷地去監測指定的服務組件是否正在運行,一分鐘檢測一次,如果發現異常,就要將異常的信息捕獲出來,然後記錄到日誌中,供開發人員排查。
可是在執行的過程中,發現一個問題,產生的日誌在記入文件的時候,沒有明確的行列標記,非常不便於操作,而且日誌是追加模式的,在分類的情況下,要按分類查找更加困難。比如:
總共產生了1W條日誌,info級別的8000條,error級別的500條,warning級別1500條,怎麼樣才能很好的組織這些數據,便於找出BUG,便於篩選呢?
我用了兩套序數操縱這些數據,一套序數是每個類別的日誌,有一個自己的序號,同時,還有一個全局的日誌序號,這種情況下,不同的業務單元中產生的日誌,只要推送到我這個單一的進程中,就能實現全局排序記錄,局部也有序列,並且保存到了同一個文件中,便於集中處理。
實現如下:
/**
*
*/
package com;
/**
* @author Administrator
*
*/
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyLog log1 = new MyLog();
MyLog log2 = new MyLog();
MyLog log3 = new MyLog();
MyLog log4 = new MyLog();
MyLog log5 = new MyLog();
log1.write(1, "running");
log1.write(2, "reopen");
log2.write(1, "starting");
log2.write(3, "crashed");
log2.write(1, "resume");
log3.write(1, "stoped");
log4.write(1, "prompt");
log5.write(2, "network failed");
log5.write(1, "network normal");
log5.write(2, "thread crash");
log5.write(3, "connect failed");
}
}
class MyLog {
private static int nSerialNo = 0;
// 0是info級別,1是warning級別,2是error級別
final int INFO_TYPE = 0;
final int WARNNING_TYPE = 1;
final int ERROR_TYPE = 2;
static int nInfoNo = 0; // 局部序號
static int nWarnningNo = 0;
static int nErrorNo = 0;
private int nGolobalNo = 0; // 全局序號
private String strMsg = ""; // 日誌消息
public void write(int type, String msg) {
strMsg = msg;
nGolobalNo = (++nSerialNo);
// 0是info級別,1是warning級別,2是error級別
switch (type) {
case INFO_TYPE:
System.out.println("Log[info][" + nGolobalNo + "]" + "[" + (++nInfoNo) + "]:" + strMsg);
break;
case WARNNING_TYPE:
System.out.println("Log[warning][" + nGolobalNo + "]" + "[" + (++nWarnningNo) + "]:" + strMsg);
break;
case ERROR_TYPE:
System.out.println("Log[error][" + nGolobalNo + "]" + "[" + (++nErrorNo) + "]:" + strMsg);
break;
default:
System.out.println("Log[unknow][" + nGolobalNo + "]" + "[" + "-" + "]:" + strMsg);
break;
}
}
}