Easy4JFinal【每日分享】将System.out、System.err写入到log中。

今天群里有个朋友咨询JFinal的Action report怎么没有写入到Log日志中。

我们来看看Action report的源码(源码位于com.jfinal.core.ActionReporter中):

/**
 * Report the action
 */
public static final void report(Controller controller, Action action) {
	StringBuilder sb = new StringBuilder("\nJFinal action report -------- ").append(sdf.get().format(new Date())).append(" ------------------------------\n");
	Class<? extends Controller> cc = action.getControllerClass();
	sb.append("Controller  : ").append(cc.getName()).append(".(").append(cc.getSimpleName()).append(".java:1)");
	sb.append("\nMethod      : ").append(action.getMethodName()).append("\n");
	
	String urlParas = controller.getPara();
	if (urlParas != null) {
		sb.append("UrlPara     : ").append(urlParas).append("\n");
	}
	...省略部分代码...
	sb.append("--------------------------------------------------------------------------------\n");
	System.out.print(sb.toString());
}

很明显Action report采用的是System.out打印到控制台的。

我们现在只要将System.out打印输出到log日志中即可,百度了一下“System.out输出到log”搞清楚原理于是开写。

/**
 * Created by L.cm on 2016/7/13.
 */
public class LogPrintStream extends PrintStream {
    private final Log log = Log.getLog("System.out");

    private final boolean error;

    public LogPrintStream(boolean error) {
        super(System.out);
        this.error = error;
    }

    @Override
    public void print(String s) {
        if (error) {
            log.error(s);
        } else {
            log.info(s);
        }
    }

    /**
     * 重写掉它,因为它会打印很多无用的新行
     */
    @Override
    public void println() {}

    @Override
    public void println(String x) {
        if (error) {
            log.error(x);
        } else {
            log.info(x);
        }
    }

    @Override
    public PrintStream printf(String format, Object... args) {
        if (error) {
            log.error(String.format(format, args));
        } else {
            log.info(String.format(format, args));
        }
        return this;
    }

    @Override
    public PrintStream printf(Locale l, String format, Object... args) {
        if (error) {
            log.error(String.format(l, format, args));
        } else {
            log.info(String.format(l, format, args));
        }
        return this;
    }
}

在JFinal的config配置中添加下列代码即可。

@Override
public void afterJFinalStart() {
	super.afterJFinalStart();

	// 正式环境,将System.out、err输出到log中
	if (!devMode) {
		System.setOut(new LogPrintStream(false));
		System.setErr(new LogPrintStream(true));
	}
}

System.out存在性能问题,推荐大家只在调试期间使用,不过此方案也可避免新手大量使用之后照成的性能问题。

今日分享就到这了,明日再聊。

Easy4JFinal源码地址:http://git.oschina.net/dreamlu/Easy4JFinal

捐助共勉
版权声明:若无特殊注明,本文皆为原创,转载请保留文章出处。