JAVA 日志工具类LogUtil

今天为啥搞这个东西?事情是这样的,平时我们会使用日志记录些信息,但是有时比较麻烦,我们常用的日志包邮log4j.slfj…等等。有时候我们经常是在可能出异常的地方输出下日志,这样找错比较容易。但是我们有时程序没异常,相看下和这个类调用了哪些方法,参数有哪些,分别是什么值,就有点吃力。我们有个要求就是在执行方法前打印下入参,执行后打印下返回值,就需要定制,于是上网看了下,好像不全,还有几个用的是安卓的包,就整了这么个玩意,发现还挺好使就分享一下。

package com.study.thread;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Field;

import org.apache.log4j.Logger;

/**
 * Title : logUtil
 * @{author} Administrator
 * @{date} 2019年8月5日
 * @{description} 日志工具类

     */
    public class logUtil {
    
    	private final static Logger log = Logger.getLogger(logUtil.class);
    	
    	/**
    	 * types 常见的数据类型,可以直接输出值。
    	 */
    	private final static String[] types= {"java.lang.String","java.lang.Integer","int","java.lang.Double",
    			"double","java.lang.Float","float","java.lang.Long","long",
    			"java.lang.Char","char","java.lang.Boolean","boolean"};
    	
    	/**
    	 *@{author} jifeng
    	 *@{date} 2019年8月5日
    	 *@{tags} @param objects
    	 * info输出信息
    	 */
    	public static void info(Object...objects) {
    		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    		String result = getPrintInfo(stack[2],objects);
    		log.info(result);
    	}
    	
    	/**
    	 *@{author} jifeng
    	 *@{date} 2019年8月5日
    	 *@{tags} @param objects
    	 * debug输出信息
    	 */
    	public static void debug(Object...objects) {
    		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    		String result = getPrintInfo(stack[2],objects);
    		log.debug(result);
    	}
    	
    	/**
    	 *@{author} jifeng
    	 *@{date} 2019年8月5日
    	 *@{tags} @param objects
    	 * error 输出信息
    	 */
    	public static void error(Object...objects) {
    		StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    		String result = getPrintInfo(stack[2],objects);
    		log.error(result);
    	}
    	
    	
    	/**
    	 *@{author} jifeng
    	 *@{date} 2019年8月5日
    	 *@{tags} @param object
    	 *@{tags} @return 获取参数值
    	 */
    	private static String getValue(Object object) {
    		StringBuilder builder = new StringBuilder();
    		int i = 0;
    		//如果是异常类,打印异常信息。
    		if (object instanceof Exception) {
    			String message = ((Exception) object).getMessage();
    			builder.append("Message:"+message+";");
    			StringWriter sw = new StringWriter();
    			//将详细异常用流输出
    			PrintWriter pw = new PrintWriter(sw,true);
    			((Exception) object).printStackTrace(pw);
    			pw.flush();
    			sw.flush();
    			builder.append(sw.toString());
    			return builder.toString();
    		}
    		if(object != null) {
    			String name  = object.getClass().getName();
    			//常见数据类型
    			for(String type : types) {
    				if(name.equals(type)) {
    					i++;
    					builder.append("paramType="+name+":"+String.valueOf(object)).append(",");
    				}
    			}
    			//实体,打印地址或者值
    			if(i==0) {
    				try {
    					Field[] fields = object.getClass().getDeclaredFields();
    					for(Field f: fields) {
    						//允许读取私有属性
    						f.setAccessible(true);
    						String filedName = f.getType().getName();
    						builder.append("paramType="+filedName+":"+f.get(object)).append(" ");
    					}
    				}catch (Exception e) {
    					e.printStackTrace();
    					builder.append(e.getMessage());	
    				}
    			}
    		}else {
    			builder.append("参数为null");
    		}
    		return builder.toString();
    	}
    	
    	/**
    	 *@{author} jifeng
    	 *@{date} 2019年8月5日
    	 *@{tags} @return
    	 */
    	private static String getPrintInfo(StackTraceElement element,Object...objects) {
    		String fileName  = element.getFileName();
    		String className = element.getClassName();
    		String methodName = element.getMethodName();
    		int lineNumber = element.getLineNumber();
    		StringBuilder builder = new StringBuilder();
    		builder.append("[");
    		builder.append("fileName="+fileName).append(";");
    		builder.append("ClassName="+className).append(";");
    		builder.append("methodName="+methodName).append(";");
    		//有参数就打印
    		if(objects.length > 0) {
    			builder.append("paramter=[");
    			for(Object obj : objects) {
    				builder.append(getValue(obj));
    			}
    			builder.append("];");
    		}
    		builder.append("lineNumber="+lineNumber).append(".");
    		return builder.toString();
    	}
    
    }

至于怎么使用就相当简单,这个工具的好处是使用了不定项参数,因为有的方法有多个参数。而且对于异常类也进行了特殊处理,还有个很好的是快速定位,直接定位到类,方法,行数。居家旅行,调试必备。

你可能感兴趣的:(工具类)