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

有没有办法在运行时创建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(); } 

这可能吗?

编辑:找到一个更短的解决方案,从Jare​​d的post中指出(尽管它仍然不是线程安全的)。 谢谢您的帮助。

  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; } } 

您可以inheritanceorg.apache.log4j.WriterAppender并为其提供ByteArrayOutputStream来存储任何消息。 请参阅WriterAppender的其他子类以获得启发。 然后,您可以向记录器提供该对象的实例,以便通过addAppender进行追加。