java后台注解式日志,利用注解记录日志

日志记录简化,只需要在action或者controller的方法上加logging注解即可。注解:@Logging(description = "{username}登录"),description是注解内容,{}中为动态参数,是传入该方法中的指定po的属性。

注解类代码:

package cn.com.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 日志注解
 * @author ZhangShaobo
 * @date 2017-09-04
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Logging {
	
	String description();
	
}

具体的日志实现类,该类中loginfo方法需要在拦截器中调用。

package cn.com.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.annotation.Logging;

/**
 * 日志注解的具体实现类
 * @author ZhangShaobo
 * @date 2018-09-04
 */
public class LogAnnoUtil {
	
	private static Logger log = LoggerFactory.getLogger(LogAnnoUtil.class);
	
	/**
	 * 根据注解记录日志
	 * @param t action对象
	 * @param methodName 调用的action方法名称
	 * @param map 参数map
	 */
	public static  void loginfo(T t, String methodName, Map map){
		Method [] methods = t.getClass().getDeclaredMethods();
    	for (final Method m : methods) {
    		if (m.getName().equals(methodName)) {
    			if(m.isAnnotationPresent(Logging.class)){
    				String desc = m.getAnnotation(Logging.class).description();
    				List list = descFormat(desc);
    				for (String s : list) {
						String value = map.get(s).toString();
						desc = desc.replace("{"+s+"}", value);
					}
    				// 暂时只是输出到了控制台,具体需要存库或者存缓存,需要改这段代码
    				log.info(desc);
    			}
			}
			
		}
	}
	
	/**
	 * 获取日志信息中的动态参数,然后替换
	 * @param desc
	 * @return
	 */
	private static List descFormat(String desc){
		List list = new ArrayList<>();
		Pattern pattern = Pattern.compile("\\{([^\\}]+)\\}"); 
        Matcher matcher = pattern.matcher(desc); 
        while(matcher.find()){ 
            String t = matcher.group(1); 
            list.add(t);
        }
		return list;
	}
	
	
}

拦截器中写调用,以上代码实现的是在struts框架中用注解记录日志,springmvc或者springboot需要适当更改代码。有好的建议或者有不明白的地方欢迎评论沟通!




你可能感兴趣的:(java后台注解式日志,利用注解记录日志)