记录到内存的Logger,可用于web动态显示内容的来源

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 一个日志工具-只记录到内存
*
* @author jeffay.jiang
*
*/
public class MemoryLogger {
public static Logger log = LoggerFactory.getLogger(MemoryLogger.class);
public static final String THIS_CLASS_NAME=MemoryLogger.class.getName();// "MemoryLogger";
public static final String TO_MSG=" >> ";

private DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS");
private PrintStream bp;
private ByteArrayOutputStream bs;
private ArrayList<String> memLog;
private int mlogSize = 500;

public MemoryLogger() {
this(500);
}

public ArrayList<String> getLogMsg() {
return memLog;
}

public MemoryLogger(int size) {
memLog = new ArrayList<String>();
mlogSize = size;
}

public void log(String msg) {
String caller = "";
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
for ( int i=0; i<stack.length; i++ ) {
if ((stack[i].getClassName().indexOf(THIS_CLASS_NAME))>=0 ) {
if(i+1<stack.length){
caller=stack[i+1].getClassName() + "." + stack[i+1].getMethodName();
}
}
}

String d = df.format(new Date());

log.info(caller+TO_MSG+msg);
memLog.add(0, d+" "+caller+TO_MSG+msg);

if (memLog.size() > mlogSize) {
memLog.remove(mlogSize);
}
}

public void log(Exception e) {
String caller = "";
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
for ( int i=0; i<stack.length; i++ ) {
if ((stack[i].getClassName().indexOf(THIS_CLASS_NAME))>0 ) {
if(i+1<stack.length){
caller=stack[i+1].getClassName() + "." + stack[i+1].getMethodName();
}
}
}

String d = df.format(new Date());
try {
String msg=toString(e);
log.info(caller+TO_MSG+msg);
memLog.add(0, d+" "+caller+TO_MSG+msg);

if (memLog.size() > mlogSize) {
memLog.remove(mlogSize);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}

public synchronized String toString(Exception ex) throws Exception {
if (bs == null) {
bs = new ByteArrayOutputStream();
bp = new PrintStream(bs, true, "utf-8");
}
if (ex == null) {
return "NULL";
}
bs.reset();
ex.printStackTrace(bp);
bp.flush();
byte[] b = bs.toByteArray();
String msg = new String(b, "utf-8");
return msg;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值