gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:07 25 4
gpt4 key购买 nike

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

最佳答案

这绝对有可能 - 尽管您可能需要创建自己的 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;
}
}

关于java - 自定义日志记录以在运行时收集消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1002926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com