您的位置:首页 > 编程语言 > Java开发

SpringAOP+注解+反射实现日志功能

2015-10-30 13:27 771 查看
知识点一:Java反射
http://www.cnblogs.com/hanhuibing/articles/4754310.html

知识点二:Java注解

http://www.cnblogs.com/hanhuibing/articles/4754385.html

知识点三:Java注解解析器

http://www.cnblogs.com/hanhuibing/articles/4754468.html

知识点四:log4g

http://www.cnblogs.com/hanhuibing/articles/4757846.html

开工

第一步:表结构





第二步:自定义日志注解类

package com.system.annotate;
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;

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
/**
* 日志信息
*
* @return
* @author 韩慧兵
* @version 2015-8-21 下午12:51:11
* @since JDK 1.6
*/
String message();
}


第三步:自定义springmvc拦截器

package com.system.interceptor;

import java.lang.reflect.Method;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.bky.controller.T_BizlogController;
import com.bky.controller.T_ErrlogController;
import com.bky.util.ApplicationContextUtil;
import com.bky.util.UtilFunction;
import com.bky.vo.T_Bizlog;
import com.bky.vo.T_Errlog;
import com.bky.vo.T_User;
import com.system.annotate.Log;
/**
* 拦截器描述:日志拦截器
*                  拦截业务日志,并持久化至业务表中;拦截错误日志,并持久化至错误表和log4g文件中
* @author   韩慧兵
* @version  2015-8-25 下午3:52:31
* @since    JDK 1.6
*/
public class LogInterceptor extends HandlerInterceptorAdapter {

/**
* 自定义log4g
*/
private static Logger logger =  Logger.getLogger("操作日志");

/**
* 毫秒级日期格式定义
*/
java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");

/**
* 请求发起时间
*/
Date methodbegin;

/**
* 请求结束时间
*/
Date methodend;

/**
* 对方法级请求进行拦截
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
* @author   韩慧兵
* @version  2015-8-25 下午3:55:12
* @since    JDK 1.6
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 只拦截方法级请求
if (handler instanceof HandlerMethod) {
// 获取session
HttpSession session = request.getSession();
T_User userinfo = (T_User) session.getAttribute("userinfo");

// 转换handmethod
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();

// 获取注解
final Log log = method.getAnnotation(Log.class);

// 日志持久化
if (log != null && null != userinfo) {
// 操作人
String username = userinfo.getUserName();
// 操作时间
String currenttime = UtilFunction.getNewDate();
// 操作角色
String rolenames = userinfo.getRoleNames();
// 操作部门
String orgnames=userinfo.getDepartNames();
// 操作单位
String companys=userinfo.getT_company().getCompanyName();
// 操作动作
String methods=log.message();
// 操作结束时间
methodend=new Date();
// 操作所需时间
long between = (methodend.getTime() - methodbegin.getTime());// 得到两者的毫秒数
// 操作状态
int handelState=0;
// 是否发生异常
if(ex!=null){
//记录异常
handelState=1;

//持久化日志文件
add_log4g_err(ex, log, username, currenttime, rolenames);

// 持久化入库
add_errlog(ex, username, currenttime, rolenames, orgnames,
companys, methods, between);
}

//持久化日志文件
add_log4g_info(log, username, currenttime, rolenames);

// 持久化入库
add_bizlog(username, currenttime, rolenames, orgnames,
companys, methods, between,handelState);
}
}

}

/**
* 持久化log4g Info 级日志
* @param ex
* @param log
* @param username
* @param currenttime
* @param rolenames
* @author   韩慧兵
* @version  2015-8-25 下午4:02:26
* @since    JDK 1.6
*/
private void add_log4g_info( final Log log, String username,
String currenttime, String rolenames) {
String logStr;
String handleState="成功";
// 操作失败日志
logStr = "操作员:" + username + " 角色:" + rolenames + "  操作时间:"
+ currenttime + "  进行:" + log.message()
+ "操作! 操作状态:"+handleState;
//定义err级别信息
logger.info(logStr);
}

/**
* 持久化log4g Err 级日志
* @param ex
* @param log
* @param username
* @param currenttime
* @param rolenames
* @author   韩慧兵
* @version  2015-8-25 下午3:50:53
* @since    JDK 1.6
*/
private void add_log4g_err(Exception ex, final Log log, String username,
String currenttime, String rolenames) {
String logStr;
String handleState="失败";
// 操作失败日志
logStr = "操作员:" + username + " 角色:" + rolenames + "  操作时间:"
+ currenttime + "  进行:" + log.message()
+ "操作! 操作状态:"+handleState+"   失败原因:" + ex.getMessage();
//定义err级别信息
logger.error(logStr);
}

/**
* 持久化至业务数据表
* @param username
* @param currenttime
* @param rolenames
* @param orgnames
* @param companys
* @param methods
* @param between
* @author   韩慧兵
* @version  2015-8-25 下午3:51:06
* @since    JDK 1.6
*/
private void add_bizlog(String username, String currenttime,
String rolenames, String orgnames, String companys, String methods,
long between,int handelState) {
T_BizlogController bizlogController=ApplicationContextUtil.getContext().getBean(T_BizlogController.class);
T_Bizlog bizlog=new T_Bizlog();
bizlog.setBizlogid(UtilFunction.getUuid());
bizlog.setBizusername(username);
bizlog.setBizrole(rolenames);
bizlog.setBizorg(orgnames);
bizlog.setHandleState(handelState);
bizlog.setBizdatetime(currenttime);
bizlog.setBizmethod(methods);
bizlog.setBizcompany(companys);
bizlog.setBizusetime(String.valueOf(between));
bizlogController.add_bizlog(bizlog);
}

/**
* 持久化至错误记录表中
* @param ex
* @param username
* @param currenttime
* @param rolenames
* @param orgnames
* @param companys
* @param methods
* @param between
* @author   韩慧兵
* @version  2015-8-25 下午3:51:23
* @since    JDK 1.6
*/
private void add_errlog(Exception ex, String username, String currenttime,
String rolenames, String orgnames, String companys, String methods,
long between) {
T_ErrlogController errlogController=ApplicationContextUtil.getContext().getBean(T_ErrlogController.class);
T_Errlog errlog=new T_Errlog();
errlog.setErrlogid(UtilFunction.getUuid());
errlog.setErrcompany(companys);
errlog.setErrdatetime(currenttime);
errlog.setErrdes(ex.getMessage());
errlog.setErrmethod(methods);
errlog.setErrorg(orgnames);
errlog.setErrrole(rolenames);
errlog.setErrusername(username);
errlog.setErrusetime(String.valueOf(between));
errlogController.add_errlog(errlog);
}

@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

}

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//记录方法开始时间
methodbegin=new Date();
return true;
}
}


第四步:sping-mvc.xml中配置自定义拦截器

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*.do" />
<bean class="com.system.interceptor.LogInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>


第五步:日志注解使用

package com.bky.controller;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bky.service.T_RoleService;
import com.bky.util.easyuivo.ComboBox;
import com.bky.util.easyuivo.Datagrid;
import com.bky.vo.T_Role;
import com.system.annotate.Log;

@Controller
public class T_RoleController extends BaseController {
// 定义service类
private T_RoleService t_roleService;

public T_RoleService getT_roleService() {
return t_roleService;
}

@Autowired
public void setT_roleService(T_RoleService t_roleService) {
this.t_roleService = t_roleService;
}

/**
* 跳转至角色列表
* @param request
* @param response
* @return
* @author   韩慧兵
* @version  2015-7-23 下午8:52:56
* @since    JDK 1.6
*/
@RequestMapping("toT_RoleList")
public String toT_RoleList(HttpServletRequest request,
HttpServletResponse response) {
return "/jnqudb/t_role/t_role_list";
}
/**
* 角色列表分页
*
* @param request
* @param response
* @return
* @author 韩慧兵
* @version 2015-6-25 上午12:02:22
* @since JDK 1.6
*/
@Log(message="角色列表查询")
@RequestMapping("getT_RoleList")
public String getT_RoleList(HttpServletRequest request,
HttpServletResponse response) {
// 获取请求
Map<?, ?> paramMap = getPageParam(request);

// 分页查询
List<T_Role> pagelist = t_roleService.getEasyUiAllList(paramMap);

// 获取总记录数
int total = t_roleService.getCountByRoleName(paramMap).size();

// 获取datagrid对象
Datagrid<?> grid = getDatagrid(pagelist, total);

// 转换datagrid为json输出至前台
super.writeJson(response, grid);

return "/jnqudb/t_role/t_role_list";
}

/**
* 跳转至增加页
*
* @param request
* @return
* @author 韩慧兵
* @version 2015-7-21 下午7:03:45
* @since JDK 1.6
*/
@Log(message="跳转至角色增加页")
@RequestMapping("toaddT_Role")
public String toaddT_Role(HttpServletRequest request) {
return "/jnqudb/t_role/t_role_add";
}

/**
* 增加角色
*
* @param request
* @param sysrole
* @return
* @author 韩慧兵
* @version 2015-7-21 下午7:03:25
* @since JDK 1.6
*/
@Log(message="增加角色")
@RequestMapping("add_role")
public void add_role(HttpServletRequest request, T_Role sysrole) {
String str = t_roleService.addInfo(sysrole);
request.setAttribute("InfoMessage", str);
}

/**
* 跳转至修改页面
*
* @param request
* @param t_role
* @return
* @author 韩慧兵
* @version 2015-7-16 下午2:55:15
* @since JDK 1.6
*/
@Log(message="跳转至角色修改页")
@RequestMapping("to_roleupdate")
public String to_roleupdate(HttpServletRequest request, T_Role t_role) {
// 根据角色id查询角色 详细信息
t_role = t_roleService.findById(t_role.getRoleId());
request.setAttribute("t_role", t_role);
return "/jnqudb/t_role/t_role_update";
}

/**
* 修改角色信息
*
* @param request
* @param depart
* @return
* @author 韩慧兵
* @version 2015-7-16 下午2:55:23
* @since JDK 1.6
*/
@Log(message="修改角色")
@RequestMapping("update_role")
public void update_role(HttpServletRequest request, T_Role trole) {
String str = t_roleService.update(trole);
request.setAttribute("InfoMessage", str);
}

/**
* 删除角色
*
* @param request
* @param trole
* @author 韩慧兵
* @version 2015-7-21 下午7:02:51
* @throws Exception
* @since JDK 1.6
*/
@Log(message="删除角色")
@RequestMapping("deletRoleInfo")
public void deletRoleInfo(HttpServletRequest request, T_Role trole,HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
/********************根据角色id查询是否有用户在使用  begin************************/
int num = t_roleService.selectuserByroleId(trole.getRoleId());
if("0".equals(num) || 0 == num){
t_roleService.delete(trole.getRoleId());
out.write("0");
}else{
out.write("1");
}
/********************根据角色id查询是否有用户在使用  end**************************/
}

/**
* 启用禁用角色
*
* @author 韩慧兵
* @version 2015-7-17 下午7:14:03
* @since JDK 1.6
*/
@Log(message="启用禁用角色")
@RequestMapping("enable_t_rolefun")
public void enable_t_rolefun(HttpServletRequest request, T_Role trole) {
int str = t_roleService.enable_t_rolefun(trole);
request.setAttribute("InfoMessage", str);
}

/**
* 获取所有角色下拉内容
* @param request
* @param response
* @param companyId
* @throws Exception
* @author   申晓玲
* @version  2015年7月22日 下午4:03:24
* @since    JDK 1.7
*/
@RequestMapping("roleAll")
public void roleAll(HttpServletRequest request,HttpServletResponse response) throws Exception {
//查询所有的角色启用的下拉内容
List<T_Role> rolelist = t_roleService.selectAllrole();
//定义ComboBox对象
List<ComboBox> comList=new ArrayList<ComboBox>();
for(int i=0;i<rolelist.size();i++){
ComboBox com = new ComboBox();
com.setId(rolelist.get(i).getRoleId());
com.setText(rolelist.get(i).getRoleName());
comList.add(com);
}
super.writeJson(response,comList);
}
}


第六步:配置log4g

log4j.rootLogger=DEBUG, Console, E ,F

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c] - %m%n-

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=ERROR
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=../temp/err_log.txt
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.Append = true
log4j.appender.E.ImmediateFlush = true
log4j.appender.E.Threshold = E
log4j.appender.E.DatePattern = '.'yyyy-MM-dd'.txt'
log4j.appender.E.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

log4j.appender.F=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File=../temp/biz_log.txt
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.Append = true
log4j.appender.F.ImmediateFlush = true
log4j.appender.F.Threshold = INFO
log4j.appender.F.DatePattern = '.'yyyy-MM-dd'.txt'
log4j.appender.F.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n


第七步:测试

控制台日志



日志文件



界面展示



ok,至此功德圆满!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: