您可以创建一个log4j appender来写入StringWriter.这是我前段时间做的一个例子:
consoleWriter = new StringWriter();
WriterAppender appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter);
appender.setName("CONSOLE_APPENDER");
appender.setThreshold(org.apache.log4j.Level.ERROR);
Logger.getRootLogger().addAppender(appender);
它将所有ERROR日志写入consoleWriter,但您可以根据需要设置日志的范围或级别.范围(记录器名称)应该是线程的唯一标识符.像这样的东西:
Logger.getLogger("Thread-00001").addAppender(appender);
您的线程应该写入此记录器.
Logger.getLogger("Thread-00001").info("blah blah blah");
当你想完成日志记录时:
Logger.getLogger("Thread-00001").removeAppender("CONSOLE_APPENDER");
更新:
这是一个有效的例子.将错误日志写入文件(在log4j.xml中设置)将所有线程日志写入StringWriter,如果启用:
import java.io.StringWriter;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.WriterAppender;
import org.apache.log4j.PatternLayout;
public class Log4jTest implements Runnable {
public static final String CONSOLE_APPENDER = "CONSOLE_APPENDER";
private static WriterAppender appender = null;
private static int counter = 1;
public static synchronized String getNextId() {
return "Thread_00"+(counter++);
}
public void run() {
String id="UNKNOWN";
try {
id = getNextId();
Logger log = Logger.getLogger(id);
log.addAppender(appender);
log.setLevel(Level.DEBUG);
log.info(id+" log message 1");
log.removeAppender(CONSOLE_APPENDER);
log.info(id+" log message 2");
log.error(id+" log message 3");
} catch (Exception e) {
System.out.println("Error in "+id);
e.printStackTrace();
}
}
public static void main(String [] args) {
try {
StringWriter consoleWriter = new StringWriter();
appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter);
appender.setName(CONSOLE_APPENDER);
appender.setThreshold(org.apache.log4j.Level.DEBUG);
for (int i=0; i<5; i++) {
Thread t = new Thread(new Log4jTest());
t.start();
}
Thread.sleep(200);
System.out.println(consoleWriter.getBuffer().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是我的log4j.xml: