有没有一种方法可以在运行时创建一个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;
}
}