【问题标题】:Custom logging to gather messages at runtime自定义日志记录以在运行时收集消息
【发布时间】:2009-06-16 17:39:12
【问题描述】:

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

这可能吗?

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

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

【问题讨论】:

标签: java log4j


【解决方案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;
    }
}

【讨论】:

  • 感谢您的帮助,为我指出了我最终使用的解决方案,尽管解决方案最终变得更简单一些。 +1。
【解决方案2】:

您可以继承 org.apache.log4j.WriterAppender 并为其提供一个 ByteArrayOutputStream 来存储任何消息。请参阅 WriterAppender 的其他子类以获取灵感。然后,您可以将该对象的实例提供给您的记录器,以便通过 addAppender 追加。

【讨论】:

  • 感谢您的帮助,为我指明了最终使用的解决方案。 +1。
猜你喜欢
  • 2012-08-15
  • 2010-12-03
  • 2023-04-02
  • 2012-02-08
  • 2014-08-13
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多