如何将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
相关产品推荐
相关产品推荐

