`
azvf
  • 浏览: 144493 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

System.out输出的信息,难于控制,让log4j接管System.out。

第一步,自定义输出流,翻译成java语言就是Log4jPrintStream extends PrintStream,在该流中重写print方法,println方法,用log.debug输出

第二部,给jvm分配新的standard输出流,翻译成java语言就是 System.setOut(new Log4jPrintStream())

 

上干货,fuck goods

测试主类,SystemOut2Log.java 

package redirect;

public class SystemOut2Log {
	static {
		Log4jPrintStream.redirectSystemOut();
	}

	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			System.out.print("abc");
			System.out.print(i);
			System.out.print((int)(Math.random()*100));
		}
	}
}

 

System.out的装饰类

package redirect;

import java.io.OutputStream;
import java.io.PrintStream;

import org.apache.log4j.Logger;

public class Log4jPrintStream extends PrintStream {
	private Logger log = Logger.getLogger("SystemOut");
	private static PrintStream instance = new Log4jPrintStream(System.out);

	private Log4jPrintStream(OutputStream out) {
		super(out);
	}

	public static void redirectSystemOut() {
		System.setOut(instance);
	}

	public void print(boolean b) {
		println(b);
	}

	public void print(char c) {
		println(c);
	}

	public void print(char[] s) {
		println(s);
	}

	public void print(double d) {
		println(d);
	}

	public void print(float f) {
		println(f);
	}

	public void print(int i) {
		println(i);
	}

	public void print(long l) {
		println(l);
	}

	public void print(Object obj) {
		println(obj);
	}

	public void print(String s) {
		println(s);
	}

	public void println(boolean x) {
		log.debug(Boolean.valueOf(x));
	}

	public void println(char x) {
		log.debug(Character.valueOf(x));
	}

	public void println(char[] x) {
		log.debug(x == null ? null : new String(x));
	}

	public void println(double x) {
		log.debug(Double.valueOf(x));
	}

	public void println(float x) {
		log.debug(Float.valueOf(x));
	}

	public void println(int x) {
		log.debug(Integer.valueOf(x));
	}

	public void println(long x) {
		log.debug(x);
	}

	public void println(Object x) {
		log.debug(x);
	}

	public void println(String x) {
		log.debug(x);
	}

}
/*
 *
 * public void println(boolean x) {
 * if(log.isDebugEnabled()) {
 * log.debug(Boolean.valueOf(x));
 * }
 * }
 */

再配合log4j.properties

log4j.rootCategory=DEBUG, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p\: %d{HH\:mm\:ss,SSS} %C{1}[ln\:%L]\: %m%n

 

看输出

DEBUG: 16:20:05,083 Log4jPrintStream[ln:77]: 4
DEBUG: 16:20:05,083 Log4jPrintStream[ln:89]: abc
DEBUG: 16:20:05,083 Log4jPrintStream[ln:77]: 7
DEBUG: 16:20:05,084 Log4jPrintStream[ln:77]: 33
DEBUG: 16:20:05,084 Log4jPrintStream[ln:89]: abc
DEBUG: 16:20:05,084 Log4jPrintStream[ln:77]: 8
DEBUG: 16:20:05,084 Log4jPrintStream[ln:77]: 89
DEBUG: 16:20:05,085 Log4jPrintStream[ln:89]: abc
DEBUG: 16:20:05,085 Log4jPrintStream[ln:77]: 9
DEBUG: 16:20:05,085 Log4jPrintStream[ln:77]: 65

 

 

 Log4j的HelloWorld 在javaSE中入门使用一

 Log4j使用的效率二

 Log4j的输出格式三

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

 

分享到:
评论
2 楼 azvf 2013-12-05  
499490717 写道
通过LZ的方式并不能在日志中定位到输出信息的位置,也就是log4j的格式化配置中的%C{1}[ln\:%L]并不能达到真正的效果。可以通过如下方式修改Log4jPrintStream类

public class Log4jPrintStream extends PrintStream {
	private static final String FQCN = Log4jPrintStream.class.getName();
	//省略部分属性和方法...
	public void println(String x) {
		printToLog(x);
	}

	private void printToLog(Object message) {
		log.log(FQCN, Level.INFO, message, null);
	}
}


果然好用,高手。
1 楼 499490717 2013-12-05  
通过LZ的方式并不能在日志中定位到输出信息的位置,也就是log4j的格式化配置中的%C{1}[ln\:%L]并不能达到真正的效果。可以通过如下方式修改Log4jPrintStream类

public class Log4jPrintStream extends PrintStream {
	private static final String FQCN = Log4jPrintStream.class.getName();
	//省略部分属性和方法...
	public void println(String x) {
		printToLog(x);
	}

	private void printToLog(Object message) {
		log.log(FQCN, Level.INFO, message, null);
	}
}

相关推荐

    Log4j日志包

    log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ...

    log4j日志驱动包

    log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #...

    log4j_properties配置详解

    ### set log levels ###log4j.rootLogger = debug , stdout , D , E### 输出到控制台 ###log4j.appender.stdout =org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target =System.outlog4j.appender.stdout....

    log4j配置文件

    log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} [ %t ] [ %p ]:%L - %m%n

    log4j入门教程.docx

    Log4j的目标是:它允许开发人员以任意的精细程度控制哪些日志说明被输出。通过使用外部的配置文件,可以在运行时配置它。 Log4j的具体在 http://logging.apache.org/log4j/找到它(有使用的文档说明)。另外,log4j...

    深入学习log4j

    Loggers组件的主要功能是提供相应API,根据不同配置的loggers将不同级别的log输入到控制台或文件,类似于java中经常用到的System.out.println,但是log4j封装后的loggers组件能够输出更丰富的信息,包括时间,线程,...

    Java Log4j所需Jar包

    Java Log4j 1,2 所需Jar包,一个完整的软件,日志是必不可少的。程序从开发、测试、维护、运行等环节,都需 要向控制台或文件等位置输出大量信息。这些信息的输出,在很多时候是使用 System.out.println()无法完成的。 ...

    log4j.properties

    log4j.appender.stdout...log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    log4j 打印日志信息 jar java

    log4j打印日志的专用的jar 里面有两个文件,一个.jar文件直接放在项目的lib里面就可以,另外的文件放在项目的src根目录的下面,打开里面就可以设置需要打印的日志信息,方便快捷查看日志信息和错误提示,欢迎下载。

    Android中 信息的输出——Log.v的使用.doc

    Android中实现信息的输出java一般的打印办法为System.out.println("");J2ME也是,在ide的控制台就可以看到效果。但是android平台,System.out.println("");你是看不到打印的消息的。因为android提供的打印方法为,...

    Log4j使用说明文档

    通常大家可以简单地使用System.out.println()语句输出日志信息,但是在发布时,通常不想在正式的版本中打印这些开发时的调试信息,于是又要手工地把这些语句删除,所以大量的这样的System.out.println()调试语句会...

    Log4j学习和详细配置

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是...

    Log4j使用手册 日志记录包

    log4j提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别。 使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时...

    Log4J教程PDF

    Log4j是一个开源的日志记录组件,其产品已经相当的成熟,且使用非常的广泛。在工程中以易用,方便等代替了 System.out 等打印语句

    log4j入门详解及运行库

    程序开发环境中的日志记录是由嵌入在程序中以输出一些对开发人员有用信息的语句所组成。例如,跟踪语句(trace),结构转储和...log4j提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别。

    log4e 1.4.2 eclispe myeclipse 插件 天涯浪子

    Log4e是一个插件,是log4j日志很好的一个编写助手,Log4e是一个免费的Eclipse插件,它可帮助你在你的Java工程中快速加入日志。而且Log4e可以帮助你把System.out.println转成日志的输出,非常方便,还可以瞬间移除...

    log4j使用教程

    一:Log4j的组件介绍 A:)Log4j的三个重要组件—— Loggers, Appenders, Layouts 这三个组件协同的工作,使得开发者能够依据信息类别和级别去纪录信息,并能够 运行期间,控制信息记录的方式已经日志存放地点。 ...

    使用高效的日志工具—Log4J

    大家在编程时经常不可避免地要使用到一些日志操作,比如开发阶段的调试信息、运行时的日志记录及审计。...通常大家可以简单地使用System.out.println()语句输出日志信息,但是往往会有一些判断,比如:

Global site tag (gtag.js) - Google Analytics