Java中读取Log4j日志并输出到GUI组件的实现代码

2019-04-18 03:07 阅读 1,474 次 评论 0 条

Java中读取Log4j日志并输出到GUI组件的实现代码(将日志截获并输出到JTextArea组件,同时自动使垂直滚动条跟随):

TextAreaLogAppender.java

package cn.ysh.studio.gui.log;  
  
import java.io.IOException;  
import java.util.Scanner;  
import javax.swing.JScrollPane;  
import javax.swing.JTextArea;  
  
/** 
 *  
 * 类描述: 
 * 不间断地扫描输入流 
 * 将扫描到的字符流显示在JTextArea上 
 */  
public class TextAreaLogAppender extends LogAppender {  
  
    private JTextArea textArea;  
    private JScrollPane scroll;  
  
    /** 
     * 默认的构造 
     * @param textArea 记录器名称,该记录器输出的日志信息将被截取并输出到指定的JTextArea组件 
     * @param scroll JTextArea组件使用的滚动面板,因为在JTextArea中输出日志时,默认会使垂直滚动条自动向下滚动,若不需要此功能,此参数可省略 
     * @throws IOException  
     */  
    public TextAreaLogAppender(JTextArea textArea, JScrollPane scroll) throws IOException {  
        super("textArea");  
        this.textArea = textArea;  
        this.scroll = scroll;  
    }  
  
    @Override  
    public void run() {  
        // 不间断地扫描输入流  
        Scanner scanner = new Scanner(reader);  
        // 将扫描到的字符流输出到指定的JTextArea组件  
        while (scanner.hasNextLine()) {  
            try {  
                //睡眠  
                Thread.sleep(100);  
                String line = scanner.nextLine();  
                textArea.append(line);  
                textArea.append("\n");  
                line = null;  
                //使垂直滚动条自动向下滚动  
                scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum());  
                            } catch (Exception ex) {  
                //异常不做处理  
            }  
        }  
    }  
}

LogDemoJFrame.java

package cn.ysh.studio.gui.test;  
  
import cn.ysh.studio.gui.log.LabelLogAppender;  
import cn.ysh.studio.gui.log.TextAreaLogAppender;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JOptionPane;  
import javax.swing.JScrollPane;  
import javax.swing.JTextArea;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
  
/** 
 *  
 * 类描述: 
 * 测试日志输出到UI组件 
 */  
public class LogDemoJFrame extends JFrame {  
  
    private JLabel logLabel;  
    private JScrollPane logScrollPane;  
    private JTextArea logTextArea;  
    private final static Log log = LogFactory.getLog(LogDemoJFrame.class);  
  
    public LogDemoJFrame() {  
        logLabel = new javax.swing.JLabel();  
        logScrollPane = new javax.swing.JScrollPane();  
        logTextArea = new javax.swing.JTextArea();  
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);  
        logLabel.setText(" ");  
  
        logTextArea.setColumns(20);  
        logTextArea.setRows(5);  
        logScrollPane.setViewportView(logTextArea);  
  
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());  
        getContentPane().setLayout(layout);  
        layout.setHorizontalGroup(  
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(logLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 610, Short.MAX_VALUE).addContainerGap()).addComponent(logScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE));  
        layout.setVerticalGroup(  
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(logLabel).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(logScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE)));  
  
        pack();  
    }  
  
    public void initLog() {  
        try {  
            Thread t1, t2;  
            t1 = new LabelLogAppender(logLabel);  
            t2 = new TextAreaLogAppender(logTextArea, logScrollPane);  
            t1.start();  
            t2.start();  
        } catch (Exception e) {  
            JOptionPane.showMessageDialog(this, e, "绑定日志输出组件错误", JOptionPane.ERROR_MESSAGE);  
        }  
    }  
  
    public static void main(String[] s) {  
        LogDemoJFrame logDemoFrame = new LogDemoJFrame();  
        logDemoFrame.initLog();  
        logDemoFrame.setVisible(true);  
        for (int i = 0; i < 1000; i++) {  
            log.info("测试日志输出:" + i);  
        }  
    }  
}  

Log4j日志配置信息:

log4j.appender.label=org.apache.log4j.ConsoleAppender  
log4j.appender.label.layout=org.apache.log4j.PatternLayout  
log4j.appender.label.layout.ConversionPattern=%m%n  
  
log4j.appender.textArea=org.apache.log4j.ConsoleAppender  
log4j.appender.textArea.layout=org.apache.log4j.PatternLayout  
log4j.appender.textArea.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  [ %p ]  %m%n  
  
log4j.rootLogger=INFO,label,textArea

转载自:https://yshjava.iteye.com/blog/1325036

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:Java中读取Log4j日志并输出到GUI组件的实现代码 | 雨晨博客
分类:JAVA, 程序笔记 标签:,

发表评论


表情