自定义日志记录聚集在运行时消息(Custom logging to gather messages

2019-06-23 09:59发布

有没有一种方法在运行时创建一个log4j的记录器,以便收集日志信息到缓冲区?

我目前有记录一些事件的类。 对于需要监视记录的事件的远程应用,我想只是交换在记录到一个缓冲区记录,然后检索该缓冲区,而不是重构类。 例如,给出这样的:

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的发布(虽然它仍然不是线程)。 谢谢您的帮助。

 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()

Answer 1:

这是绝对可能的 - 尽管你可能会需要创建自己的Appender。 这是很容易做到,虽然。 下面是一个例子的粗略输出(需要想出线程安全...这不是线程安全的....我不知道我喜欢静...但是这应该是足够好,你推在正确的方向):

public class BufferAppender extends org.apache.log4j.AppenderSkeleton {
    private static Map<String, StringBuffer> buffers = new HashMap<String, StringBuffer>();

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


Answer 2:

你可以继承org.apache.log4j.WriterAppender,并为其提供一个ByteArrayOutputStream存储任何消息。 见WriterAppender的其他子类inspriation。 然后,你可以经由addAppender追加提供对象的记录器的实例。



文章来源: Custom logging to gather messages at runtime
标签: java log4j