日志记录简化,只需要在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 <T> 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<String> 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<String> descFormat(String desc){
List<String> 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需要适当更改代码。有好的建议或者有不明白的地方欢迎评论沟通!