You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将System.out和System.err重定向到tinylog日志记录器?

将System.out和System.err重定向到tinylog的方案

你推测的System.setOut()/System.setErr()核心思路是对的,tinylog可以通过两种方式实现这个需求,以下是具体操作:

方式一:手动实现PrintStream(适配所有tinylog 2.x版本)

自己构建PrintStream,将输出内容转发到tinylog的对应级别日志:

import org.tinylog.Logger;
import java.io.OutputStream;
import java.io.PrintStream;

public class TinylogSystemRedirect {
    public static void setupRedirects() {
        // 重定向System.out到tinylog INFO级别
        System.setOut(new PrintStream(new OutputStream() {
            private final StringBuilder lineBuffer = new StringBuilder();

            @Override
            public void write(int b) {
                if (b == '\n') {
                    Logger.info(lineBuffer.toString());
                    lineBuffer.setLength(0);
                } else {
                    lineBuffer.append((char) b);
                }
            }
        }, true));

        // 重定向System.err到tinylog ERROR级别
        System.setErr(new PrintStream(new OutputStream() {
            private final StringBuilder lineBuffer = new StringBuilder();

            @Override
            public void write(int b) {
                if (b == '\n') {
                    Logger.error(lineBuffer.toString());
                    lineBuffer.setLength(0);
                } else {
                    lineBuffer.append((char) b);
                }
            }
        }, true));
    }
}

在应用启动的第一行代码调用TinylogSystemRedirect.setupRedirects()即可生效。

方式二:使用tinylog内置工具类(tinylog 2.4及以上版本)

从tinylog 2.4开始,官方提供了SystemStreamRedirector工具类,一行代码就能完成重定向:

import org.tinylog.configuration.SystemStreamRedirector;

public class Main {
    public static void main(String[] args) {
        // 默认规则:System.out → INFO级别,System.err → ERROR级别
        SystemStreamRedirector.enable();
    }
}

如果需要自定义目标日志器或级别,可以使用重载方法:

// 自定义重定向到指定日志器,System.out用DEBUG级别,System.err用WARN级别
SystemStreamRedirector.enable("com.example.MyLogger", Level.DEBUG, Level.WARN);

关键注意点

  • 必须在应用初始化的最早期执行重定向,避免启动阶段的输出丢失
  • 确保tinylog的配置文件(如tinylog.properties)中开启了对应级别的日志输出(比如INFO、ERROR级别未被过滤)
  • 手动实现的PrintStream开启了自动刷新(构造器第二个参数为true),避免日志缓存延迟输出

内容的提问来源于stack exchange,提问作者Betalord

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:42:53