Java 获取实时Log4J消息
如何在监控应用程序中所有log4j日志的中心类中获取log4j编写的内容 谢谢Java 获取实时Log4J消息,java,log4j,Java,Log4j,如何在监控应用程序中所有log4j日志的中心类中获取log4j编写的内容 谢谢 编辑:我希望我不必从日志文件中读取它,因为通过提供将日志消息输出到文件或任何其他位置的log4j配置,它将使用更多资源。您可以实现自己的日志,并使用普通配置复制其中的所有日志: log4j.rootLogger=WARN, file, other log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=${c
编辑:我希望我不必从日志文件中读取它,因为通过提供将日志消息输出到文件或任何其他位置的log4j配置,它将使用更多资源。您可以实现自己的日志,并使用普通配置复制其中的所有日志:
log4j.rootLogger=WARN, file, other
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${catalina.home}/logs/log.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %p %t %c - %m%n
log4j.appender.other=class.path.of.your.Appender
也许你的要求和我一样。我只是写了一个相关的类来实现它
public class FixedBufferAppender extends AppenderSkeleton {
private LimitTailSizeList ll;
public FixedBufferAppender(PatternLayout layOut, int size) {
this.layout = layOut;
ll = new LimitTailSizeList(size);
}
protected void append(LoggingEvent event) {
String log = this.layout.format(event);
ll.add(log);
}
public String getLatentLog() {
StringBuffer sb = new StringBuffer(100000);
for (Iterator iterator = ll.iterator(); iterator.hasNext();) {
String log = (String) iterator.next();
sb.append(log);
}
return sb.toString();
}
public void close() {
ll.clear();
ll = null;
this.closed = true;
}
public boolean requiresLayout() {
return true;
}
}
public class LimitTailSizeList extends ArrayList {
private int limitSize;
public LimitTailSizeList(int limitSize){
this.limitSize= limitSize;
}
public boolean add(Object o) {
boolean add = super.add(o);
if (size() > limitSize) {
removeRange(0, size() - limitSize);
}
return add;
}
private void initAppender(int maxTailLine) {
fba = new FixedBufferAppender(
new PatternLayout("%d [%X{requestURIWithQueryString}] %-5p -[%t] %m [%c{1}:%M %L] %n"),
maxTailLine);
Logger.getRootLogger().removeAppender("UI_APPENDER");
fba.setName("UI_APPENDER");
fba.setThreshold(org.apache.log4j.Level.DEBUG);
Logger.getRootLogger().addAppender(fba);
}
}
这会将日志重定向到我的类吗?我需要访问当前正在打印到现有日志文件的日志消息。是。为了增加魅力,你可以像任何其他附加者一样使用它。这意味着,您可以只使用配置来控制,您的类应该获得配置日志。(例如,仅警告及以上,或仅某些软件包)。感谢nfechner。这太完美了。您是否也可以共享此配置的配置xml示例?。