log4j重定向到Swing的JTextArea中

一、前言

一些研发软件会把日志打到界面上,方便工程师调试。
java里我们经常会用log4j来打日志,打到文件里,控制台都是常见操作,那么怎么把它重定向到界面里呢。

二、准备

1.win10

2.eclipse

在这里插入图片描述

3.jdk 1.8.0_221

在这里插入图片描述

4.jar

在这里插入图片描述
log4j:log4j-1.2.17.jar下载链接
实测可用,就是加载网页速度慢了点,为什么慢大家应该也能理解。
在这里插入图片描述
在这里插入图片描述

commons-logging:commons-logging-1.2.jar下载链接
在这里插入图片描述

三、结构

在这里插入图片描述

四、代码

1.main启动

package lyrics.main;

import java.awt.EventQueue;

import lyrics.ui.LogRedirectUI;
/**
 * 
 * @author lyrics
 * @since 2020/07/01
 */
public class Main {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					new LogRedirectUI();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

}

2.界面LogRedirectUI

package lyrics.ui;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

import org.apache.log4j.Logger;

import lyrics.logger.TextAreaLogAppender;

import javax.swing.JScrollPane;
import javax.swing.JButton;
/**
 * 
 * @author lyrics
 * @since 2020/07/01
 */
public class LogRedirectUI {
    private final static Logger log = Logger.getLogger(LogRedirectUI.class);
	private JFrame frame;
	private JScrollPane scrollPane = new JScrollPane();
	private JTextArea textArea = new JTextArea();

	/**
	 * Create the application.
	 */
	public LogRedirectUI() {
		initialize();
		initLog();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setVisible(true);
		frame.setTitle("Log redirect");
		frame.setBounds(100, 100, 470, 514);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		
		scrollPane.setBounds(0, 114, 452, 353);
		frame.getContentPane().add(scrollPane);
		
		
		scrollPane.setViewportView(textArea);
		
		JButton btnButton1 = new JButton("button1");
		btnButton1.setBounds(28, 53, 113, 27);
		frame.getContentPane().add(btnButton1);
		
		JButton btnButton2 = new JButton("button2");
		btnButton2.setBounds(169, 53, 113, 27);
		frame.getContentPane().add(btnButton2);
		
		JButton btnButton3 = new JButton("button3");
		btnButton3.setBounds(310, 53, 113, 27);
		frame.getContentPane().add(btnButton3);
		
		// 添加监听
		btnButton1.addActionListener(event -> {
			log.info("button 1 pressed!");
		});
		btnButton2.addActionListener(event -> {
			log.info("button 2 pressed!");
		});
		btnButton3.addActionListener(event -> {
			log.info("button 3 pressed!");
		});
	}
	 private void initLog() {
	        try {
	            Thread thread;
	            thread = new TextAreaLogAppender(textArea, scrollPane);
	            thread.start();
	        } catch (Exception e) {
	        	JOptionPane.showMessageDialog(null, "重定向错误");
	        }
	    }
}

3.日志重定向

TextAreaLogAppender


package lyrics.logger;
 
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
/**
 * 重定向 
 * 
 * 
 * @author lyrics
 * @since 2020/07/01
 */
public class TextAreaLogAppender extends LogAppender {
    private JTextArea textArea;
    private JScrollPane scroll;
 
    public TextAreaLogAppender(JTextArea textArea, JScrollPane scroll) throws IOException {
        super("textArea");
        this.textArea = textArea;
        this.scroll = scroll;
    }
 
    @SuppressWarnings("resource")
	@Override
    public void run() {
        Scanner scanner = new Scanner(reader);

        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) {
            }
        }
    }
}
 

LogAppender


package lyrics.logger;
 
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.Writer;

import org.apache.log4j.Appender;
import org.apache.log4j.Logger;
import org.apache.log4j.WriterAppender;
 
/**
 * 
 * @author lyrics
 * @since 2020/07/01
 */
public abstract class LogAppender extends Thread {
 
    protected PipedReader reader;
 
    public LogAppender(String appenderName) throws IOException {
        Logger root = Logger.getRootLogger();
        // 获取子记录器的输出源 
        Appender appender = root.getAppender(appenderName);
        // 定义一个未连接的输入流管道
        reader = new PipedReader();
        // 定义一个已连接的输出流管理,并连接到reader
        Writer writer = new PipedWriter(reader);
        // 设置 appender 输出流
        ((WriterAppender) appender).setWriter(writer);
    }
}

4.log4j.properties文件

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%%-d{yyyy-MM-dd HH:mm:ss}  [ %p ]  %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,console,textArea

五、效果

效果图一:
在这里插入图片描述
效果图二:
在这里插入图片描述
效果图三:
在这里插入图片描述

六、最后

本文有些地方参考了网上的资料,有些地方可能会有不足,望诸位海涵!
晚安!!!
工程下载链接:https://download.csdn.net/download/LyRics1996/12568246

要将产生的log传送到Java Swing控件,可以使用log4j的Appender机制。以下是一个简单的示例,将log输出JTextArea: 1.创建一个自定义的Appender类,继承自org.apache.log4j.WriterAppender类,重写append方法,将log信息输出JTextArea。 ```java import javax.swing.JTextArea; import org.apache.log4j.WriterAppender; import org.apache.log4j.spi.LoggingEvent; public class SwingAppender extends WriterAppender { private JTextArea textArea; public SwingAppender(JTextArea textArea) { this.textArea = textArea; setWriter(new SwingAppenderWriter(textArea)); } @Override public void append(LoggingEvent event) { super.append(event); textArea.append(event.getMessage().toString()); textArea.append(System.getProperty("line.separator")); } private class SwingAppenderWriter extends java.io.Writer { private JTextArea textArea; public SwingAppenderWriter(JTextArea textArea) { this.textArea = textArea; } @Override public void write(char[] cbuf, int off, int len) throws IOException { textArea.append(new String(cbuf, off, len)); } @Override public void flush() throws IOException { textArea.repaint(); } @Override public void close() throws IOException { } } } ``` 2.在应用程序添加SwingAppender,将log信息输出JTextArea。 ```java import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class LogToSwing { private static Logger logger = Logger.getLogger(LogToSwing.class); public static void main(String[] args) { JFrame frame = new JFrame("Log To Swing Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); frame.getContentPane().add(scrollPane); SwingAppender appender = new SwingAppender(textArea); logger.addAppender(appender); PropertyConfigurator.configure("log4j.properties"); logger.info("Hello, World!"); frame.setSize(400, 300); frame.setVisible(true); } } ``` 3.在log4j.properties文件配置SwingAppender。 ```properties log4j.rootLogger=INFO, swingAppender log4j.appender.swingAppender=com.example.SwingAppender log4j.appender.swingAppender.layout=org.apache.log4j.PatternLayout log4j.appender.swingAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} - %m%n ``` 这样,当应用程序运行时,产生的log将输出JTextArea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值