近日测试中遇到一个需求,要使用程序不断地去监测指定的服务组件是否正在运行,一分钟检测一次,如果发现异常,就要将异常的信息捕获出来,然后记录到日志中,供开发人员排查。
可是在执行的过程中,发现一个问题,产生的日志在记入文件的时候,没有明确的行列标记,非常不便于操作,而且日志是追加模式的,在分类的情况下,要按分类查找更加困难。比如:
总共产生了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;
}
}
}