java自定义日志_java-自定义日志记录以在运行时收集消息

有没有一种方法可以在运行时创建一个log4j Logger来将日志消息收集到缓冲区中?

我目前有一个记录许多事件的类.对于需要监视记录的事件的远程应用程序,我只想交换记录到缓冲区的记录器,然后检索缓冲区,而不是重构类.例如.给出类似的东西:

Class Foo{

Logger log = ....;

public void doSomething(){

log.debug(...

.. actual code

log.debug(...

}

}

//我想从一些外部代码中做些什么:

String showFooLog(){

Foo f = new Foo();

f.log=new Logger(...

f.doSomething();

return f.log.contents();

}

这可能吗?

编辑:找到了一个简短的解决方案,从贾里德的帖子中指出(尽管它仍然不是线程安全的).谢谢您的帮助.

Logger l = Logger.getLogger( ... );

StringWriter writer = new StringWriter();

WriterAppender appender = new WriterAppender( new HTMLLayout(), writer );

l.addAppender( appender );

... run code here

writer.flush();

l.removeAppender( appender );

return writer.toString()

最佳答案

这绝对有可能-尽管您可能需要创建自己的Appender.不过,这确实很容易做到.这是一个示例的粗略介绍(需要考虑线程安全性……这不是线程安全性…….而且我不确定我是否喜欢静态函数……但这应该足以推动您的工作了.)朝正确的方向):

public class BufferAppender extends org.apache.log4j.AppenderSkeleton {

private static Map buffers = new HashMap();

@Override

protected void append(LoggingEvent evt) {

String toAppend = this.layout.format(evt);

StringBuffer sb = getBuffer(evt.getLoggerName());

buffer.append(toAppend);

}

public static String getBufferContents(String loggerName) {

StringBuffer sb = buffers.get(sb);

if(sb == null) {

return null;

} else {

return sb.toString();

}

}

public static void clearBuffer(String loggerName) {

createBuffer(loggerName);

}

private static StringBuffer getBuffer(String loggerName) {

StringBuffer sb = buffers.get(loggerName);

if(sb == null) {

sb = createBuffer(loggerName);

}

return sb;

}

private static StringBuffer createBuffer(String loggerName) {

StringBuffer sb = new StringBuffer();

buffers.put(loggerName, sb);

return sb;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值