2011-04-05 56 views
1

如何获得log4j正在中心类中监视应用程序中的所有log4j日志的内容?获取实时Log4J消息

感谢

编辑:我想我也不会从日志文件中读取它,因为它会使用更多的资源

回答

5

您可以实现自己的Appender和使用正常的配置副本上的所有日志:

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 
+0

这会将日志重定向到我的课程吗?我需要访问当前正在打印到现有日志文件的日志消息。 – Josh 2011-04-05 09:53:45

+0

是的。为了增加魅力,你可以像任何其他appender一样使用它。意思是说,你可以只使用配置来控制日志,你的班级应该得到这个日志。 (例如,只有WARN及以上,或只有特定的软件包)。 – nfechner 2011-04-05 09:56:06

+0

谢谢nfechner。太棒了。 – Josh 2011-04-05 10:10:59

0

通过提供输出日志信息到文件或其他地点log4j配置。

+0

正在阅读文件的唯一方法?没有其他办法? – Josh 2011-04-05 09:37:50

3

也许你的要求是与我相同。我只是写一个相关的类来实现它。

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); 
    } 
} 
+0

你还可以分享这个配置xml示例吗? – omega 2013-09-17 15:20:06