将System.out输出到log4j

在项目中我们通常有这样的需求,一般情况System.out.println()是输出到控制台,但我们希望System.out的输出也记录到log中,还有System.err同样也记录到log中,一些runtimeexception会通过System.err打出到控制台,我们同样希望把这些也都输出到log
System类有setOut方法,可以设置output stream,进行output重定向,所以我们可以传入一个新的PrintStream对象,重写PrintStreamprint方法,把要print的值都通过log4j写入到log,因此我们实现一个这样的类:

import java.io.PrintStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class StdOutErrRedirect {
    private final static Log logger = LogFactory.getLog(StdOutErrRedirect.class);

    public static void redirectSystemOutAndErrToLog() {
        PrintStream printStreamForOut = createLoggingWrapper(System.out, false);
        PrintStream printStreamForErr = createLoggingWrapper(System.out, true);
        System.setOut(printStreamForOut);
        System.setErr(printStreamForErr);
    }

    public static PrintStream createLoggingWrapper(final PrintStream printStream, final boolean isErr) {
        return new PrintStream(printStream) {
            @Override
            public void print(final String string) {
                if (!isErr){
                    logger.debug(string);
                }else{
                    logger.error(string);
                }
            }
            @Override
            public void print(boolean b) {
                if (!isErr){
                    logger.debug(Boolean.valueOf(b));
                }else{
                    logger.error(Boolean.valueOf(b));
                }
            }
            @Override
            public void print(char c) {
                if (!isErr){
                    logger.debug(Character.valueOf(c));
                }else{
                    logger.error(Character.valueOf(c));
                }
            }
            @Override
            public void print(int i) {
                if (!isErr){
                    logger.debug(String.valueOf(i));
                }else{
                    logger.error(String.valueOf(i));
                }
            }
            @Override
            public void print(long l) {
                if (!isErr){
                    logger.debug(String.valueOf(l));
                }else{
                    logger.error(String.valueOf(l));
                }
            }
            @Override
            public void print(float f) {
                if (!isErr){
                    logger.debug(String.valueOf(f));
                }else{
                    logger.error(String.valueOf(f));
                }
            }
            @Override
            public void print(double d) {
                if (!isErr){
                    logger.debug(String.valueOf(d));
                }else{
                    logger.error(String.valueOf(d));
                }
            }
            @Override
            public void print(char[] x) {
                if (!isErr){
                    logger.debug(x == null ? null : new String(x));
                }else{
                    logger.error(x == null ? null : new String(x));
                }
            }
            @Override
            public void print(Object obj) {
                if (!isErr){
                    logger.debug(obj);
                }else{
                    logger.error(obj);
                }
            }
        };
    }
}

http://seeallsea.iteye.com/blog/2117458


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:将System.out输出到log4j

文章字数:384

本文作者:Bin

发布时间:2016-04-12, 17:24:51

最后更新:2019-08-06, 00:47:46

原始链接:http://coolview.github.io/2016/04/12/Java/%E5%B0%86System-out%E8%BE%93%E5%87%BA%E5%88%B0log4j/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录