我有一个在NetBeans中实现的GUI应用程序。对于从用户输入提供的各种功能,使用jar,其使用log4j进行日志记录。一切都好,但我必须将信息从log4j重定向到我的GUI中的文本区域。我发现要从log4j重定向到swing文本区域,必须扩展AppenderSkeleton。我的问题是我不能修改gui(例如有一个扩展AppenderSkeleton的JTextArea)所以我必须有一个附加到我的JTextarea的类。现在我的应用程序初始化之前 log4j。我的问题是我无法找到一种方法将属性设置为AppenderSkeleton自定义类,这是对我的gui的jtextarea的引用,因此当log4j初始化appender时,它将传递对应用程序文本区域的引用。 我在log4J配置文件中尝试过类似的东西: log4j.appender.myAppender.theTextArea = path.to.myFrameclass.theTextArea 跳跃,log4j会调用我的appender中的setter和我框架中的getter来设置文本区域,但它不起作用。 如何通过log4j初始化appender,将信息重定向到我的应用程序? 或者我的应用程序是否有办法初始化自定义appender并通知log4j使用它进行日志记录? 谢谢!
答案 0 :(得分:4)
最简单的选择是在GUI初始化后以编程方式添加appender。像这样:
Logger.getRootLogger().addAppender(yourTextAreaAppender);
编辑:要仅记录INFO级别,请执行以下操作:
yourTextAreaAppender.addFilter(new Filter() {
@Override
public int decide(LoggingEvent event) {
if (event.getLevel().equals(Level.INFO)) {
return ACCEPT;
} else {
return DENY;
}
}
});
答案 1 :(得分:1)
这可能很简单,
在log4j.property文件中指定属性,在我的例子中是:
log4j.rootLogger=S
log4j.appender.S=com.ibm.nzna.projects.qit.gui.StatusMessageAppender
log4j.appender.S.layout=org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern=%m
使用以下代码编写新类:
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
/**
* @author Ashish Tyagi
*
*/
public class StatusMessageAppender extends AppenderSkeleton {
private StatusBar statusBar = AppDefaultWin.getStatusBar();
protected void append(LoggingEvent event) {
if(event.getLevel().equals(Level.INFO)){
//here set the text of your swing component;
//in my case it is: statusBar.st_STATUS.setText(event.getMessage().toString());
}
}
public void close() {
}
public boolean requiresLayout() {
return false;
}
}