`

拦截 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();
}

}

}
分享到:
评论
1 楼 zhousheng193 2010-08-09  
学习一下!!!

相关推荐

    Log4j将System.out搞到log4j中输出四

    当然,这只是基本的实现方式,实际应用中可能需要考虑更多细节,比如错误流的处理(`System.err.println()`)、多线程环境下的同步问题以及更复杂的过滤和日志级别控制等。通过这种方式,我们不仅可以将`System.out....

    用于测试使用java.lang.System的代码的JUnit规则集合

    在`java.lang.System`类中,有如`System.out`、`System.in`和`System.err`这样的全局变量,它们分别代表了标准输出、标准输入和标准错误流。在常规的测试环境中,这些流的输出很难捕获和控制。然而,使用`system-...

    AOP修改方法的参数

    System.err.println("异常: " + e.toString()); } } } public class LogInterceptor implements InvocationHandler { private Object delegate; public LogInterceptor(Object delegate) { this.delegate =...

    在java中截获控制台输出

    首先,Java中的`System.out.println()`和`System.err.println()`是我们常见的控制台输出方式,它们主要用于调试和信息打印。但是,这些输出在图形用户界面(GUI)环境下并不直接可见,因为GUI没有与之对应的控制台...

    java反射与代理实现AOP

    System.err.println("发生异常:" + e.toString()); } } } ``` 这种方式的问题在于,如果业务逻辑类增加,那么需要在每个类中重复相同的日志代码,这不仅增加了代码量,也降低了代码的可维护性。 **使用AOP改进*...

    安卓日志分析崩溃拦截相关-这个demo主要讲解了怎样使用log查看日志和怎样控制log的等级.zip

    这些库提供了更高级的功能,如日志切割、日志归档以及更方便的API。 二、崩溃拦截 1. UncaughtExceptionHandler:当Android应用发生未捕获的异常时,系统会默认调用`UncaughtExceptionHandler`。开发者可以自定义...

    java web如何解决瞬间高并发

    System.out.println(Thread.currentThread().getId()+"I'm Customer.Queue current size="+blockingQueue.size()); String data = (String) blockingQueue.poll(10, TimeUnit.SECONDS); if(data!=null){ System....

    网络抓包程序

    System.err.println("No device found"); return; } // 打开设备 PcapHandle handle = device.openLive(65536, PcapHandle FLAGS_PROMISCUOUS, 1000); // 定义处理数据包的回调函数 PacketListener ...

    java利用mybatis拦截器统计sql执行时间示例

    System.err.println(sql); } return returnValue; } ``` 在`getSql`方法中,我们可以根据配置和`BoundSql`对象来构建带参数的SQL语句,以便于直接复制到查询分析器中执行: ```java private String getSql...

    异步HTTP客户端开发包 HttpAsyncClient

    System.out.println("Response received: " + response.getStatusLine()); // 处理响应 } @Override public void failed(Exception ex) { System.err.println("Request failed: " + ex.getMessage()); } @...

    微信小程序 websocket 实现SpringMVC+Spring+Mybatis

    System.out.println("收到消息:" + message.getPayload()); // 处理接收到的消息,并可能向其他客户端广播 for (WebSocketSession s : sessions) { if (!s.equals(session)) { s.sendMessage(message); } } ...

    韩顺平struts视频学习笔记

    System.out.println("用户名: " + userForm.getName() + " 密码 " + userForm.getPw()); if ("123".equals(userForm.getName())) { return mapping.findForward("ok"); } else { return mapping.findForward(...

    详解MyBatis自定义Plugin插件

    System.err.println("拦截的方法名是:" + name); // 可以修改参数内容 queryArgs[1] = 2; return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, ...

    PCIe错误处理机制是如何工作的.docx

    其次,整条链路上支持 DPC 的设备(DP 和 RP)是否使能了 DPC 如果使能了 DPC trigger enable,下游设备发送的 ERR_FATAL 或 ERR_NONFATAL 的 error message 会被 DPC 拦截。 然后,整条链路上的所有 PCIe 设备的 ...

    在信网关错误码汇总

    - **20=RESP_SYSTEM_ERR**: 系统错误,通常是指网关内部发生的错误。 - **21=RPT_DEST_BREAK**: 目的地不可达,指的是虽然路由表存在路由,但被路由的节点暂时无法提供服务。 - **22=RPT_ROUTE_ERR**: 路由错误,...

Global site tag (gtag.js) - Google Analytics