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);