最近学习java,《Thinking in Java》中讲述接口嵌套,多态时,在一些方法内并没有具体的实现,主要表述的是思想。对新手而言,练习书中的demo则没有那么直观。于是想在各方法内打些log以加强理解。按照以前C中常用的做法,使用宏来选择log输出的格式,或者封装为接口,以一个入参来选择输出格式。
#define DEBUG_FORMAT_1
#define DEBUG_FORMAT_2
#define DEBUG_FORMAT_N
#ifdef DEBUG_FORMAT_1
#define LOG_INFO(fmt...)\
do{\
print("[%16s] - %4d: ",__FUNCTION__, __LINE__);\
print(fmt);\
print("\n");\
}while(0)
#elif defined(DEBUG_FORMAT_2)
....
#else
#define LOG_INFO(fmt...) \
do {}while(0)
#endif
以前的思维惯性导致第一想法是在JAVA中定义一个基类,通过子类继承来获取行号信息
class GetLineInfo{
public String GetLine(){
StackTraceElement ste = new Throwable().getStackTrace()[1];
return ste.getFileName() + " Line:" + ste.getLineNumber() + "--";
}
}
一次尝试之后,感觉此方法太鸡肋,在继承或接口层次深一点时提供的信息过少。想到JAVA如此高级的语言在JDK里或者三方库肯定有支持的,于是找到log4j框架。借鉴前辈,拿来主义。
1、下载commons-logging-1.2-bin.zip & log4j-1.2.17.zip ,解压后将jar添加进Eclipse 项目
2、配置log4j.properties ,输出到控制台,格式化输出。保存到工程下
log4j.rootLogger=DEBUG,CONSOLE
log4j.addivity.org.apache=true
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %l [%t] %-5p %c %x - %m%n
package c07.parcell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class GetLineInfo{
public String GetLine(){
StackTraceElement ste = new Throwable().getStackTrace()[1];
return ste.getFileName() + " Line:" + ste.getLineNumber() + "--";
}
}
public class Parcell extends GetLineInfo{
public Parcell(){
}
class Contents extends GetLineInfo{
private String ret ;
public Contents(){
ret = GetLine() + "toString of Contents Class is called";
}
public String toString(){
return ret;
}
}
class Destination extends GetLineInfo{
private String ret;
public Destination(){
ret = GetLine() + "toString of Destination Class is called";
}
public String toString(){
return ret;
}
}
public void ship(String str){
System.out.println(GetLine()+str);
System.out.println(new Contents());
System.out.println(new Destination());
logger.info(new Destination());
}
private static Log logger = LogFactory.getLog(Parcell.class);
public static void main(String args[]){
Parcell parcell = new Parcell();
parcell.ship("ship() of Parcell");
logger.info("Done");
}
}
Output:
Parcell.java Line:1--ship() of Parcell
Parcell.java Line:23--toString of Contents Class is called
Parcell.java Line:34--toString of Destination Class is called
c07.parcell.Parcell.ship(Parcell.java:45) [main] INFO c07.parcell.Parcell - Parcell.java Line:34--toString of Destination Class is called
c07.parcell.Parcell.main(Parcell.java:52) [main] INFO c07.parcell.Parcell - Done
以上demo中Parcell 类中ship()调用GetLine()无效,目前不知道原因。还需要学习一个。