java:输出带行号信息的简易日志

log4j输出日志是很方便的,但有的时候,不希望依赖太多第三方库,但希望用类似log4j的方式方便在控制台输出程序运行的基本信息,用System.out.printf输出又无法显示代码位置,而且printf还要注意匹配输出参数的类型有点麻烦。
就想着自己写一个简单的日志输出方法代替System.out.printf.
基本的原理就是获取当前线程的堆栈信息StackTraceElement[],通过StackTraceElement获取当前的类的文件名和行号,与输入的参数一起转成String输出。

/**
 * 简单日志输出工具类
 * @author guyadong
 *
 */
public class SampleLog {
	private static final String DELIM_STR = "{}";
	private static final Object[] EMPTY_ARGS = new Object[0];
	private static void log(PrintStream printStream,int level, String format, Object ... args){
		if(null == printStream || null == format){
			return;
		}
		if(null == args){
			args = EMPTY_ARGS;
		}
		StringBuilder buffer = new StringBuilder(format.length() + 64);
		int beginIndex = 0,endIndex=0,count=0;
		while((endIndex = format.indexOf(DELIM_STR, beginIndex))>=0){
			buffer.append(format.substring(beginIndex, endIndex));
			try{
				buffer.append(args[count++]);
			}catch(IndexOutOfBoundsException e){
				// 数组越界时对应占位符填null
				buffer.append("null");
			}
			beginIndex = endIndex + DELIM_STR.length();
		}
		buffer.append(format.substring(beginIndex,format.length()));
		Thread currentThread = Thread.currentThread();
		StackTraceElement stackTrace = currentThread.getStackTrace()[level];
		printStream.printf("[%s] (%s:%d) %s\n",
				currentThread.getName(),
				stackTrace.getFileName(),
				stackTrace.getLineNumber(),
				buffer.toString());
	}
	/**
	 * 向{@code printStream}输出日志信息<br>
	 * example:
	 * <pre>
	 * log("name : {},age:{}","tom",23);
	 * </pre>
	 * @param printStream
	 * @param format 格式字符串,采用{@code '{}'}为占位符,占位符个数要与{@code args}数组长度匹配
	 * @param args
	 */
	public static void log(PrintStream printStream,String format, Object ... args){
		log(printStream,3,format,args);	
	}
	/**
	 * 向控制台输出日志信息<br>
	 * @param format 格式字符串,采用{@code '{}'}为占位符
	 * @param args
	 * @see #log(PrintStream, String, Object...)
	 */
	public static void log(String format, Object ... args){
		log(System.out,3,format,args);
	}
}

调用示例:

	@Test
	public void test() {
		SampleLog.log("wwwwww", "tom");
		SampleLog.log("name {},age:{}");
		SampleLog.log("name {},age:{} ww", "tom");
		SampleLog.log("name {},age:{},date:{},time:{}", "tom",23,new Date());
	}

输出

[main] (SampleLogTest.java:15) wwwwww
[main] (SampleLogTest.java:16) name null,age:null
[main] (SampleLogTest.java:17) name tom,age:null ww
[main] (SampleLogTest.java:18) name tom,age:23,date:Tue Mar 27 21:58:15 CST 2018,time:null

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值