拦截 System.out 以及 System.err

本文介绍了一种方法,通过拦截System.out和System.err,将打印信息输出到指定的文件中,实现日志文件记录。
针对System.out 以及 System.err 进行拦截 比如将打印信息 输出到指定的文件:
不如 拦截 Jdk logger 的 ConsoleHandler 或者 logj4j的 ConsoleAppender 时
一下是 demo 代码:

============================================================
package com.bes.graphics;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.RandomAccessFile;

public class SystemErrInterceptor {

private SystemErrInterceptor(){
System.setErr(new SelfPrintStream());
System.setOut(new SelfPrintStream());
}

private static final SystemErrInterceptor instance = new SystemErrInterceptor();

public static final SystemErrInterceptor getInstance(){
return instance;
}


private static class SelfPrintStream extends PrintStream{

public SelfPrintStream(){
super(new SelfOutputStream());
}

@Override
public void print(boolean b) {
log(String.valueOf(b));
}

@Override
public void print(char c) {
log(String.valueOf(c));
}

@Override
public void print(char[] s) {
log(new String(s));
}

@Override
public void print(double d) {
log(String.valueOf(d));
}

@Override
public void print(float f) {
log(String.valueOf(f));
}

@Override
public void print(int i) {
log(String.valueOf(i));
}

@Override
public void print(long l) {
log(String.valueOf(l));
}

@Override
public void print(Object obj) {
log(String.valueOf(obj));
}

@Override
public void print(String s) {
log(s);
}

@Override
public void println() {
log("\n");
}

@Override
public void println(boolean x) {
log(x + "\n");
}

@Override
public void println(char x) {
log(x + "\n");
}

@Override
public void println(char[] x) {
log(new String(x) + "\n");
}

@Override
public void println(double x) {
log(x + "\n");
}

@Override
public void println(float x) {
log(x + "\n");
}

@Override
public void println(int x) {
log(x + "\n");
}

@Override
public void println(long x) {
log(x + "\n");
}

@Override
public void println(Object x) {
log(x + "\n");
}

@Override
public void println(String x) {
log(x + "\n");
}



}


private static class SelfOutputStream extends ByteArrayOutputStream{

@Override
public synchronized void write(byte[] b, int off, int len) {
log(String.valueOf(b));
}

@Override
public synchronized void write(int b) {
log(String.valueOf(b));
}

@Override
public void write(byte[] b) throws IOException {
log(String.valueOf(b));
}

}


/**
* @param obj
*/
private static void log(Object obj){
try{
File f = new File("c:/a.log");
if(!f.exists()){
f.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(f, "rw");
raf.seek(raf.length());
String msg = obj + "\r\n";
raf.write(msg.getBytes("utf-8"));
}catch(Exception ex){
ex.printStackTrace();
}

}

}
java.net.ConnectException: Failed to connect to /192.168.1.218:9999 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:189) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.RealConnection.buildConnection(RealConnection.java:173) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:114) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:193) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:129) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:98) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 2025-09-29 17:12:57.383 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at com.lzy.okgo.interceptor.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:76) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.RealCall.access$100(RealCall.java:33) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.RealCall$AsyncCall.execute(RealCall.java:120) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 2025-09-29 17:12:57.384 19469-19469 System.err com.jsxz.pdhsznzbkzq W at java.lang.Thread.run(Thread.java:920)
最新发布
09-30
03-12 19:05:45.149904 29300 29389 W System.err: java.lang.SecurityException: Not allowed to start service Intent { act=onetrack.action.TRACK_EVENT flg=0x2 pkg=com.miui.analytics (has extras) } without permission com.miui.analytics.onetrack.TRACK_EVENT 03-12 19:05:45.149965 29300 29389 W System.err: at android.app.ContextImpl.startServiceCommon(ContextImpl.java:2041) 03-12 19:05:45.149971 29300 29389 W System.err: at android.app.ContextImpl.startService(ContextImpl.java:2002) 03-12 19:05:45.149992 29300 29389 W System.err: at android.content.ContextWrapper.startService(ContextWrapper.java:866) 03-12 19:05:45.150001 29300 29389 W System.err: at com.android.bluetooth.util.OneTrackInterfaceUtil.track(OneTrackInterfaceUtil.java:212) 03-12 19:05:45.150008 29300 29389 W System.err: at com.android.bluetooth.util.OneTrackInterfaceUtil.trackTwsHeadset(OneTrackInterfaceUtil.java:1380) 03-12 19:05:45.150013 29300 29389 W System.err: at com.android.bluetooth.hfp.HeadsetService.onConnectionStateChangedFromStateMachine(HeadsetService.java:3419) 03-12 19:05:45.150018 29300 29389 W System.err: at com.android.bluetooth.hfp.HeadsetStateMachine$HeadsetStateBase.broadcastConnectionState(HeadsetStateMachine.java:972) 03-12 19:05:45.150023 29300 29389 W System.err: at com.android.bluetooth.hfp.HeadsetStateMachine$HeadsetStateBase.broadcastStateTransitions(HeadsetStateMachine.java:954) 03-12 19:05:45.150030 29300 29389 W System.err: at com.android.bluetooth.hfp.HeadsetStateMachine$Connected.enter(HeadsetStateMachine.java:2035) 03-12 19:05:45.150035 29300 29389 W System.err: at com.android.bluetooth.x.com.android.internal.util.StateMachine$SmHandler.invokeEnterMethods(StateMachine.java:1043) 03-12 19:05:45.150040 29300 29389 W System.err: at com.android.bluetooth.x.com.android.internal.util.StateMachine$SmHandler.performTransitions(StateMachine.java:889) 03-12 19:05:45.150044 29300 29389 W System.err: at com.android.bluetooth.x.com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:829) 03-12 19:05:45.150050 29300 29389 W System.err: at android.os.Handler.dispatchMessage(Handler.java:109) 03-12 19:05:45.150056 29300 29389 W System.err: at android.os.Looper.loopOnce(Looper.java:249) 03-12 19:05:45.150061 29300 29389 W System.err: at android.os.Looper.loop(Looper.java:337) 03-12 19:05:45.150065 29300 29389 W System.err: at android.os.HandlerThread.run(HandlerThread.java:85) 03-12 19:05:45.150167 29300 29300 D SilenceDeviceManager: handleMessage: 11解释下这段日志
04-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值