JAVA log4j 控制台输出日志

最近学习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()无效,目前不知道原因。还需要学习一个。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值