eclipse中log4j无法输出到控制台

Log4j折腾了半天就是无法输出到控制台。log4j.properties文件也到处放了,还是会产生please initialize the log4j system properly的错误。

于是决定在代码中配置一个简单的stdLogger,实现了基本的Log功能。

import org.apache.log4j.*;

public class Log {
	public static Logger stdLogger=null;	
	static{
		stdLogger=Logger.getLogger("stdout");
		ConsoleAppender ca=new ConsoleAppender(
				new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN),
				"System.out");
		stdLogger.addAppender(ca);
	}
}
值得注意的是,在new ConsoleAppender的时候必须要有参数,要指定PatternLayout参数,否则就会报错:

ERROR No output stream or file set for the appender named [null].

原因是无参数的构造函数实际没有进行任何初始化操作。

这是ConsoleAppender的源码:

   45     /**
   46       * Constructs an unconfigured appender.
   47       */
   48     public ConsoleAppender() {
   49     }
   50   
   51       /**
   52        * Creates a configured appender.
   53        *
   54        * @param layout layout, may not be null.
   55        */
   56     public ConsoleAppender(Layout layout) {
   57       this(layout, SYSTEM_OUT);
   58     }
   59   
   60       /**
   61        *   Creates a configured appender.
   62        * @param layout layout, may not be null.
   63        * @param target target, either "System.err" or "System.out".
   64        */
   65     public ConsoleAppender(Layout layout, String target) {
   66       setLayout(layout);
   67       setTarget(target);
   68       activateOptions();
   69     }

所以构造函数中必须要传入参数。
另外,为了像printf,或System.out.format那样格式化输出,可以将输出函数包装一下:

import org.apache.log4j.*;

public class Log {
	public static Logger stdLogger=null;	
	static{
		stdLogger=Logger.getLogger("stdout");
		ConsoleAppender ca=new ConsoleAppender(
				new PatternLayout(PatternLayout.DEFAULT_CONVERSION_PATTERN),
				"System.out");
		stdLogger.addAppender(ca);
		stdLogger.setLevel(Level.DEBUG);
	}
	
	public static void debug(String format, Object... args){
		String str=String.format(format, args);
		stdLogger.debug(str);		
	}
	
	public static void info(String format, Object... args){
		String str=String.format(format, args);
		stdLogger.info(str);
	}
	
	public static void warn(String format, Object... args){
		String str=String.format(format, args);
		stdLogger.warn(str);
	}
	
	public static void error(String format, Object... args){
		String str=String.format(format, args);
		stdLogger.error(str);
	}
	
	public static void fatal(String format, Object... args){
		String str=String.format(format, args);
		stdLogger.fatal(str);
	}
}
在程序里就可以这样使用了:

Log.debug("Thread %s get %d",Thread.currentThread().getName(), result);
展开阅读全文

没有更多推荐了,返回首页