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