logback日志重定向到JavaFx的TextArea

原文:https://stackoverflow.com/questions/39247784


在JavaFX中将SLF4J日志重定向到TextArea(Redirecting SLF4J log to TextArea in JavaFX)_电脑培训 (656463.com)

原问题答案输出中文时会出现乱码,将 继承自 FilterOutputStream 的 DelegatingOutputStream 类的 public void write(byte[] b) 方法重写为 out.write(b),在TextAreaOutputStream中重写write(byte[] b){ textArea.appendText((new String(b)));}即可

public class MyStaticOutputStreamAppender<E> extends OutputStreamAppender<E> {


    private static final DelegatingOutputStream DELEGATING_OUTPUT_STREAM = new DelegatingOutputStream();

    @Override
    public void start() {
        setOutputStream(DELEGATING_OUTPUT_STREAM);
        super.start();
    }

    public static void setStaticOutputStream(OutputStream outputStream) {
        DELEGATING_OUTPUT_STREAM.setOutputStream(outputStream);
    }

    private static class DelegatingOutputStream extends FilterOutputStream {

        /**
         * Creates a delegating output stream with a NO-OP delegate
         */
        public DelegatingOutputStream(){
            //在被替换之前使用的outputStream
            super(new OutputStream() {
                @Override
                public void write(int b) {}
            });
        }
        //重写FilterOutputStream的这个方法,否则appender调用writeBytes的时候还是会调FilterOutputStream的,无法调用TextAreaOutputStream重写的
        @Override
        public void write(byte[] b){
            try {
                out.write(b);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        void setOutputStream(OutputStream outputStream) {
            this.out = outputStream;
        }
    }

}
public class TextAreaOutputStream extends OutputStream {

    private TextArea textArea;

    public TextAreaOutputStream(TextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) {
        Platform.runLater(() -> {
            //用Platform.runLater来运行需要高频调用的方法 否则会出现textArea报空指针和下标越界
            textArea.appendText(String.valueOf((char) b));
            //        滚动到底部
            textArea.setScrollTop(Double.MAX_VALUE);
        });
    }
    @Override
    public void write(byte[] b) {
        Platform.runLater(() -> {
            //用Platform.runLater来运行需要高频调用的方法 否则会出现textArea报空指针和下标越界
            textArea.appendText((new String(b)));
            //        滚动到底部
            textArea.setScrollTop(Double.MAX_VALUE);
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值