将System.out输出到log4j
在项目中我们通常有这样的需求,一般情况System.out.println()
是输出到控制台,但我们希望System.out
的输出也记录到log
中,还有System.err
同样也记录到log
中,一些runtime
的exception
会通过System.err
打出到控制台,我们同样希望把这些也都输出到log
。System
类有setOut
方法,可以设置output stream
,进行output
重定向,所以我们可以传入一个新的PrintStream
对象,重写PrintStream
的print
方法,把要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);
}
}
};
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。